8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外

Slides:



Advertisements
Similar presentations
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
Advertisements

6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
JavaScript プログラミング入門 2006/11/10 神津.
コンパイラ 2011年11月14日
IO - 入出力 小西 亨.
Applet 岡部 祐典 鈴木 敬幸.
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
独習Java ・ 12.1  インターネットアドレス ・ 12.2  サーバーソケットとソケット  12月 19日    小笠原 一恵.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
例外処理 Exception Handling
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
PHPの基礎と開発手法 Based on PHP5
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
コンパイラの解析 (4) 例外処理.
プログラミング言語入門 手続き型言語としてのJava
JAVA入門.
JAVA入門後期⑩ 情報処理試験例題解説.
アルゴリズムとプログラミング (Algorithms and Programming)
UDPマルチキャストチャット                    空川幸司.
独習Java ・ 8.1  例外処理 ・ 8.2  catch ブロックの検索  12月 5日    小笠原 一恵.
例外処理 と ファイル入出力 情報システム学科 平塚 聖敏.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
第7回独習Javaゼミ セクション 1~4 発表者 直江 宗紀.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
リファレンス,配列,例外処理 その他演習に役立つこと
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
コンパイラの解析 (3) クラスとインスタンスの初期化.
アスペクト指向言語による 例外処理の記述方法の改善
第11週:super/subクラス、継承性、メソッド再定義
暗号技術 ~JAVAプログラム①~ (5週目)
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向プログラミングと開発環境
独習Java ・ 5.7  静的変数と静的メソッド ・ 5.8  ローカル変数と変数のスコープ  11月20日    小笠原 一恵.
オブジェクト プログラミング 第2回 プログラムの基本.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造演習(7月1日) 例外処理 2019/5/8.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
暗号技術 ~JAVAプログラム②~ (6週目)
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
第5回 プログラミングⅡ 第5回
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外 第8回Javaゼミ 8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外 2006/06/07 神津 健太

8.1 例外処理(1) 例外の例 表示されるメッセージ このメッセージからは11行目で算術例外オブジェクトが生成されていることが 8.1 例外処理(1) 例外の例 class DivideByZero{ public static void main(String args[]){ a(); } static void a(){ b(); static void b(){ int i = 1; int j = 0; System.out.println(i/j); このメッセージからは11行目で算術例外オブジェクトが生成されていることが わかる。この例外は、例外処理メカニズムによって処理される。 例外に関する情報が表示され、アプリケーションの実行が停止される。 表示されるメッセージ Exception in thread "main"               java.lang.ArithmeticException: / by zero at DivideByZero.b(DivideByZero.java:11) at DivideByZero.a(DivideByZero.java:6) at DivideByZero.main(DivideByZero.java:3)

8.1 例外処理(2) プログラムの実行中に発生した例外を、ユーザーの用意した処理ルーチンで処理することができる。 8.1 例外処理(2) プログラムの実行中に発生した例外を、ユーザーの用意した処理ルーチンで処理することができる。 try{ //tryブロック } catch(ExceptionType1 param1){ //例外処理ブロック catch(ExceptionType2 param2){ ・ catch(ExceptionTypeN paramN){ finally{ //finallyブロック tryブロック           例外の発生を監視するコードを記述。         このコードの実行中に問題が起こった場合、 例外が投げられる。 catchブロック             tryブロック内のコード実行中に問題発生した場合、実行を停止し、例外処理できるcatchブロックを検索する。例外オブジェクトの種類がCatchブロックのパラメータと一致した場合、その処理が実行される。   paramNは、発生した問題に関する情報を格納したオブジェクト。 finallyブロック      catchブロックが終わるとfinnalyに移行する。 必ずfinallyブロックを実行するようにオブジェクトコードが生成されるのでTryブロックが正常に終わるとfinnalyブロックが実行される。tryブロックにreturnがあっても戻る前に必ず実行される。

8.1 例外処理(3) 例外処理の例 class Divider{ 8.1 例外処理(3) 例外処理の例 class Divider{ public static void main(String args[]){ try{ System.out.println("Before Division"); int i = Integer.parseInt(args[0]); int j = Integer.parseInt(args[1]); System.out.println(i/j); System.out.println("After Division"); } catch(ArithmeticException e){ System.out.println("ArithmeticException"); catch(ArrayIndexOutOfBoundsException e){ System.out.println("ArrayIndexOutOfBoundsException"); catch(NumberFormatException e){ System.out.println("NumberFormatException"); } finally{ System.out.println("Finally block");

8.1 例外処理(4) 実行結果 >java Divider >java Divider 1 0 Before Division 8.1 例外処理(4) 実行結果 >java Divider Before Division ArrayIndexOutOfBoundsException Finally block >java Divider 1 >java Divider 1 0 Before Division ArithmeticException Finally block >java Divider 1 1 1 After Division

8.2 catchブロックの検索(1) catchブロックの検索はtryブロックの直後の1つ目から開始される。これは一致するまで行われる。 例外オブジェクトに対応するcatchブロックがない場合、他のtryブロックのcatchブロックが検索される。 それでも見つからない場合は、さらにスタックをさかのぼってメソッドが検索される。 main()メソッドまでさかのぼっても見つからない場合は、既定の例外処理が呼び出され、例外メッセージを表示して終わる。

8.2 catchブロックの検索(2) class CatchSearch{ public static void a(){ public static void main(String args[]){ try{ System.out.println("Before a"); a(); System.out.println("After a"); } catch(Exception e){ System.out.println("main: " + e); finally{ System.out.println("main: finally"); public static void a(){ try{ System.out.println("Before b"); b(); System.out.println("After b"); } catch(ArithmeticException e){ System.out.println("a: " + e); finally{ System.out.println("a: finally");

8.2 catchブロックの検索(3) public static void b(){ public static void c(){ try{ System.out.println("Before c"); c(); System.out.println("After c"); } catch(ArrayIndexOutOfBoundsException e){ System.out.println("b: " + e); finally{ System.out.println("b: finally"); public static void c(){ try{ System.out.println("Before d"); d(); System.out.println("After d"); } catch(NumberFormatException e){ System.out.println("c: " + e); finally{ System.out.println("c: finally");

8.2 catchブロックの検索(4) 実行結果 public static void d(){ try{ int array[] = new int[4]; array[10] = 10; } catch(ClassCastException e){ System.out.println("d: " + e); finally{ System.out.println("d: finally"); >java CatchSearch Before a Before b Before c Before d d: finally c: finally b: java.lang.ArrayIndexOutOfBoundsException: 10 b: finally After b a: finally After a main: finally

8.3 throwステートメント(1) throwステートメントを使って、プログラム内で明示的に例外を生成することができる。 throw object; objectはjava.lang.Throwble型でなければエラーになる。 catchブロック内部では、引数として例外オブジェクトを投げることができる。 catch(ExceptionType param){ ・ throw param; } 新しい例外オブジェクトを作成して投げるには、 throw new ExceptionType(args);

8.3 throwステートメント(2) lass ThrowDemo{ public static void a(){ public static void main(String args[]){ try{ System.out.println("Befor a"); a(); System.out.println("After a"); } catch(ArithmeticException e){ System.out.println("main: " + e); finally{ System.out.println("main: finally"); public static void a(){ try{ int i = 1; int j = 0; System.out.println("Befor Division"); System.out.println(i/j); System.out.println("After Division"); } catch(ArithmeticException e){ System.out.println("a: " + e); throw e; finally{ System.out.println("a: finally");

8.3 throwステートメント(3) 実行結果 >java ThrowDemo Befor a Befor Division a: java.lang.ArithmeticException: / by zero a: finally main: java.lang.ArithmeticException: / by zero main: finally a()メソッド内に、この例外に該当するcatchブロックがある。このブロックで引数として受け取った例外オブジェクトを投げる。 そのため、該当するcatchブロックの検索がmain()メソッドでも継続される。main()メソッドでも該当するcatchブロックがあり、ここで例外処理が完了する。

8.3 throwステートメント(4) class ThrowDemo2{ public static void a(){ public static void main(String args[]){ try{ System.out.println("Befor a"); a(); System.out.println("After a"); } catch(ArithmeticException e){ System.out.println("main: " + e); finally{ System.out.println("main: finally"); public static void a(){ try{ System.out.println("Befor throw statement"); throw new ArithmeticException(); } catch(ArithmeticException e){ System.out.println("a: " + e); finally{ System.out.println("a: finally");

8.3 throwステートメント(5) 実行結果 >java ThrowDemo2 Befor a Befor throw statement a: java.lang.ArithmeticException a: finally After a main: finally a()メソッド内のtryブロックにthrowステートメントがある。ここで例外を作成し、直後のcatchブロックで例外処理が完了する。 throwステートメントでは、new演算子を使って、ArithmeticExceptionオブジェクトを作成している。

8.4 例外とエラークラス(1) Throwbleクラス 8.4 例外とエラークラス(1) Throwbleクラス 全ての例外、エラークラスのスーパークラス。CatchブロックにはTrowble型のパラメータが必ず1つなければならない。コンストラクタは次のとおり。 Throwble() Throwble(String message) message:問題を通知する文字列のメッセージ Throwbleクラスのメソッド ・ String getMessage() コンストラクタから提供された文字列を返す。 ・  void printStackTrace() 問題が発生した時点でのスタック情報を表示する。 スタック情報を標準出力に表示。

8.4 例外とエラークラス(2) Errorクラス Exceptionクラス RuntimeExceptionクラス 8.4 例外とエラークラス(2) Errorクラス  Throwbleクラスを拡張する。JVMで検出される可能性がある重大な問題を表す サブクラスが10以上ある。 Exceptionクラス  Throwbleクラスを拡張する。実行時に発生する可能性があるさまざまな問題を  表すサブクラスがある。コンストラクトは次のとおり。 Exception() Exception(String message) RuntimeExceptionクラス  Exceptionクラスの最も重要なサブクラス。プログラムの実行中に発生する頻度 が高い問題を表す。コンストラクタは次の通り。 RuntimeException() RuntimeException(String message)

8.4 例外とエラークラス(3) class PSTDemo{ public static void a(){ 8.4 例外とエラークラス(3) class PSTDemo{ public static void main(String args[]){ try{ a(); } catch(ArithmeticException e){ e.printStackTrace(); public static void a(){ try{ int i = 1; int j = 0; System.out.println(i/j); } catch(NullPointerException e){ e.printStackTrace();

8.4 例外とエラークラス(4) 実行結果 >java PSTDemo 8.4 例外とエラークラス(4) 実行結果 >java PSTDemo java.lang.ArithmeticException: / by zero at PSTDemo.a(PSTDemo.java:14) at PSTDemo.main(PSTDemo.java:4) ArithmeticException例外が発生した時点で、スタックには各メソッドの情報が積まれている。この例外はmain()メソッドで例外処理される。そのとき、 printStackTrace()メソッドが呼び出され、例外発生時のスタック情報が表示される。

8.5 throwsステートメント(1) 呼び出し元に対して例外を投げる可能性があるメソッドの場合、どの例外が投げられるのかを明示しておくと便利。  → コンストラクタ内のthrowsステートメントを使う。次のような構文になる。 consModifiers clsName(cparam) throws exceptions{ // コンストラクタの本体 } メソッドの宣言では次のようになる。 mthModifiers rtype mthName(mparam) throws exceptions{ // メソッドの本体

8.5 throwsステートメント(2) class ThrowsDemo{ public static void b() public static void main(String args[]){ a(); } public static void a(){ try{ b(); catch(ClassNotFoundException e){ e.printStackTrace();  public static void b()     throws ClassNotFoundException{ c(); } public static void c() Class cls = Class.forName("java.lang.Integer"); System.out.println(cls.getName()); System.out.println(cls.isInterface());

8.5 throwsステートメント(3) 実行結果 >java ThrowsDemo java.lang.Integer false c()メソッドではClassクラスのforName()メソッドを呼び出す。このときClassNotFoundException例外が投げられる可能性がある。 そのためc()メソッドではthrowsステートメントを記述して、 ClassNotFoundException例外が投げられる可能性があることを宣言している。 b()メソッドも同様。 a()メソッドでは例外を捕獲するのでthrowsステートメントは不要。

8.6 独自の例外(1) Javaには、独自の例外クラスを作成する機能がある。 8.6 独自の例外(1) Javaには、独自の例外クラスを作成する機能がある。 このようなクラスはExceptionのサブクラスとして作成する。 例外のインスタンスを投げるには、throwsステートメントを使う。 import java.util.*; class ExceptionSubclass{ public static void main(String args[]){ a(); } static void a(){ try{ b(); catch(Exception e){ e.printStackTrace(); static void b() throws ExceptionA{ try{ c(); } catch(ExceptionB e){ e.printStackTrace(); static void c() throws ExceptionA, ExceptionB{ Random random = new Random(); int i = random.nextInt(); if(i % 2 == 0){ throw new ExceptionA("We have a problem");

8.6 独自の例外(2) else{ class ExceptionB extends Exception{ 8.6 独自の例外(2) else{ throw new ExceptionB("We have a big problem"); } class ExceptionA extends Exception{ public ExceptionA(String message){ super(message); class ExceptionB extends Exception{ public ExceptionB(String message){ super(message); }

8.6 独自の例外(3) 実行結果 >java ExceptionSubclass 8.6 独自の例外(3) 実行結果 >java ExceptionSubclass ExceptionB: We have a big problem at ExceptionSubclass.c(ExceptionSubclass.java:30) at ExceptionSubclass.b(ExceptionSubclass.java:17) at ExceptionSubclass.a(ExceptionSubclass.java:9) at ExceptionSubclass.main(ExceptionSubclass.java:5) ExceptionAクラスとExceptionBクラスはExceptionクラスを拡張する。 c()メソッドでは無作為な値を作成し、A,Bどちらの例外を投げるか決定する。 b()メソッドのthrowsステートメントにはExceptionAのみ記述。ExceptionB例外はメソッド内のcatchブロックで処理される。 a()メソッドはすべての例外を処理するcatchブロックがあるので、throwssテートメントの記述は不要。

練習問題(1) 整数値のみの除算を行うプログラムを作りなさい。 ただし、引数が不足している場合、第2引数が0の場合、引数が整数値ではない場合は、それぞれ任意のエラーメッセージが表示されるようにしなさい。 実行結果例 >java IntDiv 引数が足りません >java IntDiv 1 0 第2引数が0では計算できません >java IntDiv 1 0.5 整数値しか計算できません >java IntDiv 1 1 1/1=1

練習問題(2) 年齢を入力すると、「平成生まれ」、「昭和生まれ」、「大正生まれ」かを表示するプログラムを作りなさい。(大正以前の人はいないものとする。)また、問題1と同様に任意のエラーメッセージも表示させなさい。 ただし、System.out.println()およびprint()は使わないこと。 独自の例外を作成してそれを利用すること。 注) 大正:~1926年  昭和:1927~1988年  平成:1989年~ とする。 実行結果例 >java Nendai 10 Exception in thread "main" ExceptionH: 平成生まれ at Nendai.main(Nendai.java:10)