例外処理 Exception Handling

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
社会人学習講座 「Javaプログラミング概論」
GridLayout オブジェクト(省略)
コンパイラ 2011年11月14日
自社製ミドルウエアをDalvikと連携させることが可能になる
プログラミング基礎I(再) 山元進.
IO - 入出力 小西 亨.
Imageの描画 画像を読み込んで表示すること。 import java.awt.*;が必要。
Applet 岡部 祐典 鈴木 敬幸.
~手続き指向からオブジェクト指向へ(Ⅰ)~
Ex7. Search for Vacuum Problem
プログラミング基礎I(再) 山元進.
Ex8. Search for Vacuum Problem(2)
JAVA GUIプログラミング 第6回 TextFieldとLabel.
復習ーII (General Review II)
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
プログラミング基礎I(再) 山元進.
JAVA.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
JAVA GUIプログラミング 第5回 ボタンとそのイベント処理.
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Javaプログラムの実行まで バイト Javaの コード 実行 ソースコード Java ファイル名 ファイル名 abc.java
アプレット プログラミング 第10回 アプレット プログラミング第10回.
アルゴリズムとデータ構造 2011年6月20日
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
ストップウォッチの カード ストップウォッチの カード
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
8.1 例外処理 8.2 catchブロックの検索 8.3 throwステートメント 8.4 例外とエラークラス 8.6 独自の例外
プログラミング言語入門 手続き型言語としてのJava
JAVA入門後期⑩ 情報処理試験例題解説.
独習Java ・ 8.1  例外処理 ・ 8.2  catch ブロックの検索  12月 5日    小笠原 一恵.
例外処理 と ファイル入出力 情報システム学科 平塚 聖敏.
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
リファレンスの復習と例外処理 2005年6月14日 海谷 治彦.
第3回 2007年4月27日 応用Java (Java/XML).
コンパイラの解析 (3) クラスとインスタンスの初期化.
第11週:super/subクラス、継承性、メソッド再定義
ソフトウェア制作論 平成30年10月3日.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
Ex7. Search for Vacuum Problem
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
JAVA入門後期④ イベント、AWT、の基本構造、スレッド
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造演習(7月1日) 例外処理 2019/5/8.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとプログラミング (Algorithms and Programming)
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

例外処理 Exception Handling メソッドの実行時基本流れ図 例外処理の基本構造 – try/catch/finally blocks Error/Exception/Runtime_Exception Throwableクラスと例外クラスの定義 例外オブジェクト:例外スロー(throws, throw)

例外(exception)とは何か (What is the exception?) (1)日常の例外   例外というのは、規則(規律)をまもらないということです。    例えば、私は毎日6時に起きます。けれども今週の日曜日は例外です。 (2)Java言語の例外    Java言語の例外は、Java言語の規則をまもらないのことです。    例えば、1)   配列の長さを超えた添え字で要素を参照しょうとした。 int a[] = new int[3]; //aの添字は、0から2までの整数です。 a[6] = 7;                =>ArrayIndexOutOfBoundsException L61 2) 割り算の分母は0になる場合。 =>ArithmeticException L62               3) ファイルをオープンしようとしたが、ファイルがない。 =>FileNotFoundException Golden rule: errors occur  コンパイル時エラー   Errors in compile プログラムの実行時エラー(致命)   Errors in program execution -- serious error, con not recover  プログラムの実行時例外(修復できる) Exceptions in program execution -- not serious error, can recover

Example of Java exception without exception handling 配列の範囲を超える ゼロによる割り算 public class arrayTest { public static void main(String[] args) { int[ ] a = new int[3]; System.out.println("a[2]に代入する"); a[2] = 8; System.out.println("a[2]に代入した"); System.out.println("a[3]に代入する"); a[3] = 5; System.out.println("a[3]に代入した"); System.out.println("終了します"); } public class DivideByZero { public static void main(String[] args) { System.out.println( quotient(3, 5)); System.out.println( quotient(3, 0)); System.out.println( quotient(5, 6));  } public static double quotient(int bunshi, int bunbo)  {   return (double) bunshi / bunbo; } ここで例外 (ゼロによる割り算) が起きる ここで例外 (配列の範囲を越えた) が起きる 実行結果:L61 実行結果:L62

例外処理 Exception handling 例外処理とは、プログラム実行中のエラーを通知し、適切なエラー処理が出来るようにする機構です。  (必ずしもエラーだけでなく、例外的な処理に利用されることも) int[ ] a = new int[3]; a[2] = 8; //ok a[3] = 5; //例外(ArrayIndexOutOfBoundsException)          // が発生する。 例外処理をされると クラスArrayIndexOutOfBoundsException のインスタンスがスローされる int[ ] a = new int[3]; try { .... a[3] = 5; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("例外" + e + "です"); } 例外が起きる かも知れない範囲をtry{ }で囲む キャッチする 例外のクラス キャッチした 例外オブジェクト が入る 例外処理の プログラム

メソッドの実行時基本流れ図 メソッドの実行時エラーがないとメソッドが本流によって実行されます。 例外処理のは三つのステップがある。 method start エラーがある With error 例外オブジェクトの生成とスロー (throw) エラーなし No error 例外処理のは三つのステップがある。  例外オブジェクトのスロー  例外のキャッチ  例外の処理コード 例外をRuntime Systemへ届ける Runtime System error 本流 exception 誰がこの例外を処理するを決める 例外のキャッチ(catch) 決められないの場合 Runtime Systemで誰がこの例外を処理することを決められないとプログラム/メソッドが中断されます。 例外処理のコード method end Program end or Next method

例外処理の基本構造 (Exception handling mechanism) try-catch-finally try{ 例外オブジェクトのスロー(投げる) } catch(exception1 e){ 例外1の処理 catch(exception2 e){ 例外2の処理 …… finally{ リソースの解放 no exception with exception メソッドで、 try { .... }の範囲を実行中にスローされた例外を catch (... ) {.... }の(... )でキャッチして{.... }で処理する。 例外がスローされなかった場合はcatch (... ) {.... }を  スキップ。 一つのtryブロックに対しでは、0個以上catch ブロークを置きます。 finallyブロックはオプションです。そこにはリソースを解放するためのコードを入れて置くのに最適な場所です。

Java言語の例外処理の例(Example of exception handing) public class exceptionTest{ public static void main(String[] args) { int[ ] a = new int[3]; try { System.out.println(“a[2]に代入する”); a[2] = 8; System.out.println("a[2]に代入した"); System.out.println(“a[3に代入する”); a[3] = 5; System.out.println("a[3]に代入した"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("例外" + e + "です"); } catch (Exception e) { System.out.println("Exception" + e + "です"); } finally { System.out.println("finally"); } System.out.println("終了します"); ここで例外オブジェクト (配列の範囲を越えた) がスローされる。 throw キャッチした例外オブジェクトを出力する handling ここで例外オブジェクト (配列の範囲を越えた) をキャッチする。 catch 例外がスキップ 実行結果: L61, L62

Throwableクラスと例外クラスの定義 Object Throwable Exception Runtime … error public class Throwable extends Object{ public Throwable(); public Throwable(String message); public String getMessage(); public void printStackTrace(); …… } public class Error extends Throwable{ public Error(); public Error(String s); } public class Exception extends Throwable{ public Exception(); public Exception(String s); } Other Exception – checked exception: must be caught and handled ClassNotFoundException  …… IOException AWTException RuntimeException – unchecked exception: may or may not be caught and handled ArithmeticException  …… IndexOutOfBoundsException ArrayIndexOutOfBoundsException   StringIndexOutOfBoundsException NegativeArraySizeException …… public class DivideByZeroException extends Exception{ public DivideByZeroException() { super(“Attempted to divide by zero”);} }

try { ArrayIndexOutOfBoundsException Runtime 例外クラスの例 java.lang.Object | +--java.lang.Throwable +--java.lang.Exception +--java.lang.RuntimeException +--java.lang.IndexOutOfBoundsException +--java.lang.ArrayIndexOutOfBoundsException ArrayIndexOutOfBoundsException() Constructs an ArrayIndexOutOfBoundsException with no detail message. ArrayIndexOutOfBoundsException(int index) Constructs a new ArrayIndexOutOfBoundsException class with an argument indicating the illegal index. ArrayIndexOutOfBoundsException(String s) Constructs an ArrayIndexOutOfBoundsException class with the specified detail message. try { int a[] = new int[2]; a[4] = 10;; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("exception: " + e.getMessage()); e.printStackTrace(); } public String getMessage() Returns the errort message string of this throwable object. public void printStackTrace() Prints this Throwable and its backtrace to the standard error stream.

throws節とthrow文 例外は二種類: DivideByZeroExceptionを宣言します 例外は二種類:  unchecked – ErrorとRuntimeExceptionのsub クラス checked – 自分定義の例外クラス public class DivideByZeroException extends Exception{ public DivideByZeroException() { super(“Attempted to divide by zero”);} } コンストラクタ unchecked exception クラスは、メソッドにthrows節でこの例外をスローする可能性があるという宣言することが必要ない。 public double quotient(int numerator, int denominator) throws DivideByZeroException { if (denominator == 0) throw new DivideByZeroException(); return (double) numerator / denominator; } checked exception クラスは、メソッドにthrows節でこの例外をスローする可能性があるという宣言することが必要です。 このメソッドには DivideByZeroExceptionをスローする可能性があるという宣言 DivideByZeroExceptionをここでスローします

例外のキャーチと処理 (Example of exception handling) public class DivideByZero { public static void main(String[] args) { try { System.out.println( quotient(3, 5)); System.out.println( quotient(3, 0)); System.out.println( quotient(5, 6)); } catch (DivideByZeroException e) { System.out.println( e); finally{System.out.println( “Finished !”);} public double quotient(int numerator, int denominator) throws DivideByZeroException { if (denominator == 0) throw new DivideByZeroException(); return (double) numerator / denominator; メソッドquotient()を呼び出し 実行結果: L65 ここでキャッチ される このメソッドは DivideByZeroExceptionをスローする可能性があるという宣言 キャッチした例外オブジェクトを出力する finallyブロックなくでもよい DivideByZeroExceptionを宣言します DivideByZeroExceptionをここでスローします public class DivideByZeroException extends Exception{ public DivideByZeroException() { super(“Attempted to divide by zero”);} }

課題 (Exercise) import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.text.DecimalFormat; public class example extends Applet implements ActionListener { private Label p1; private TextField input; private int x; private double y[] = new double[10]; public void init() { p1=new Label("Enter a number (0 to 9)"); add(p1);input = new TextField(10); input.addActionListener(this); add(input); } public void paint(Graphics g) { DecimalFormat precision2 = new DecimalFormat("#.00"); int xx= 70; g.drawString("y[0~9]: ", 20, 50); for(int i=0; i<y.length; i++) { g.drawString(precision2.format(y[i])+" ",xx,50); xx+=30;} public void actionPerformed(ActionEvent e) x = Integer.parseInt(input.getText()); y[x]= f(x); showStatus("y["+x+"] = f("+x+")="+ precision2.format(y[x])); input.setText(""); repaint(); public static double f(int x) { return 1.0/(double)(Math.log(2*x*x-5*x+2)); } <html> <applet code="example.class" width=450 height=100> </applet> </html> y = f(x) = 1/log(2x²-5x+2) for x=0~9を計算して、y[10]の配列の中に結果を格納するアプレットのプログラム(example)が左に与えられている。プログラムとそれに連なったHTMLファイルをタイプした後、コンパイルして実行せよ。テキストフィールドに0~9の数字を入力し、アプレットに何が表示されるのかを確認せよ。0未満、もしくは9以上の数字を入力したとき、MS-DOSウィンドウにどのような例外メッセージが表示されるか?例外が起こったとき、ArrayIndexOutOfBoundsExceptionをtry/catchブロックを使ってメッセージ “You must enter an integer from 0 to 9”が表示されるようにせよ。  整数以外の文字を入力したとき、どのような例外メッセージがMS-DOSウィンドウ上に表れるか?例外が起こったとき、try/catchブロックを使用してNumberFormatException をハンドルし、“You must enter an integer. Other characters are illegal”というメッセージを表示させよ。 "1"を入力したとき、特殊文字が表示される。これはlog()関数の変数が負の値であるためである。レクチャーノートのDivideByZeroExceptionクラスを 参照して、このタイプの例外と一致する例外クラスlogOfNegativeValueを定義せよ。またメソッド(int x){...}で例外をスローせよ。前述のプログラムの例外をハンドルせよ、またそれに対応する例外メッセージ "Unable to calculte the logarithm for a negative value"を示せ。

Exercise import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.text.DecimalFormat; public class example extends Applet implements ActionListener { private Label p1; private TextField input; private int x; private double y[] = new double[10]; public void init() { p1=new Label("Enter a number (0 to 9)"); add(p1);input = new TextField(10); input.addActionListener(this); add(input); } public void paint(Graphics g) { DecimalFormat precision2 = new DecimalFormat("#.00"); int xx= 70; g.drawString("y[0~9]: ", 20, 50); for(int i=0; i<y.length; i++) { g.drawString(precision2.format(y[i])+" ",xx,50); xx+=30;} public void actionPerformed(ActionEvent e) x = Integer.parseInt(input.getText()); y[x]= f(x); showStatus("y["+x+"] = f("+x+")="+ precision2.format(y[x])); input.setText(""); repaint(); public static double f(int x) { return 1.0/(double)(Math.log(2*x*x-5*x+2)); } <html> <applet code="example.class" width=450 height=100> </applet> </html> Give the left applet program that calculates y = f(x) = 1/log(2x²-5x+2) for x=0~9, and puts the results into an array y[10]. Type the program and the associative HTML file, compile and run it. Input number 0 ~9 in the text filed and watch what will be shown in the applet. When you input a number less than 0 or greater than 9, what exception messages are displayed in your MS-DOS window? Handle this ArrayIndexOutOfBoundsException using try/catch blocks and show a message, “You must enter an integer from 0 to 9”, when the exception occurs. When you input a character(s) which is not an integer, what exception messages are displayed in your MS-DOS window? Handle this NumberFormatException using try/catch blocks and show a message, “You must enter an integer. Other characters are illegal”, when the exception occurs. When you input ‘1’, a special symbol will be shown. This is because the variable of the log( ) function is a negative value. Define an exception class corresponding to this type of exception by referring the DivideByZeroException class in the lecture note, and throw the exception in the method f(int x) { … }. Handle the exception in the previous program, and show the corresponding exception message.

課題 arrayIndexOutOfBoundExceptionを自分で定義して次のようなJavaアプレットを作成せよ。自身で作成したarrayIndexOutOfBoundExceptionの例外を備えさせ、TextFieldに10個の整数を入力し、それを配列に格納するようなアプレット。ex1 devideByZeroExceptionを自身で定義し(レクチャーノートの例を修正して分母を整数型でなくフロート型を扱えるようにする)、次のようなJavaアプレットを作成せよ。2つのTextFieldにそれぞれフロート、もしくは整数型の数値を入力し、割り算の計算をさせる。 ex2

課題 Define your own arrayIndexOutOfBoundException. Make a Java applet to input 10 integers from TextField, store the integers in an array with considerations of handling exception using your own defined arrayIndexOutOfBoundException. ex1 Define your own divideByZeroException (modify the example in today’s lecture note so that a denominator has a float type rather than integer type ). Make a Java applet that is able to input two numbers with float or integer type from two TextField, and do calculation of division (refer to the textbook fig. 12.1). ex2