プログラミング言語 3 第 09 回 (2007 年 11 月 26 日 ) 1 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 2/40 1
今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/java06/ にアクセスすると 教材があります 2007 年 11 月 27 日分と書いてある部分が 本日の教材です 本日の内容 前回の課題の解答 例外処理 3/40 前回の課題の解答 4/40 2
前回の課題 その 1: 次のような仕様を満たすプログラムを書きなさい 文字列 Hello World を全部大文字にし 文字の並びを逆順にしたものを 画面に出力する 5/40 プログラム例 public class Sample08f{ public static void main(string[] args){ String ss01 = "Hello World"; String ss02; StringBuffer sb; ss02=ss01.touppercase(); sb=new StringBuffer(ss02); sb.reverse(); System.out.println(sb); 6/40 3
方針 : プログラムの流れ 大文字にするのに String クラスのメソッド touppercase 文字列を逆順するのに StringBffer クラスのメソッド reverse を利用する プログラムの流れ 1. String クラスのインスタンス ss01 と ss02 StringBffer クラスのインスタンス sb を生成する ss01 には "Hello World" を代入 2. ss02=ss01.touppercase() として 全部大文字にした結果を ss02 に代入 3. sb に ss02 の値を代入する 4. sb.revers() として 文字列を逆順にする 7/40 プログラム例 public class Sample08f{ public static void main(string[] args){ String ss01 01 = "Hello World"; String ss02; StringBuffer sb; ss01, ss02, sb を宣言 ss01にhello Worldを保存 ss02=ss01.touppercase(); sb=new StringBuffer(ss02); sb.reverse(); System.out.println(sb); 8/40 4
プログラム例 public class Sample08f{ public static void main(string[] args){ String ss01 = "Hello World"; String ss02; ss01.touppercase() は StringBuffer sb; ss01の内容 "Hello World" を大文字にしたものを返す ss02= 02=ss ss01. 01.toUpperCase touppercase(); sb=new StringBuffer(ss02); そして 戻り値をss02 sb.reverse(); に保存 System.out.println(sb); Stringクラスのメソッドは 保存している文字列自体は変更しないことに注意 9/40 プログラム例 public class Sample08f{ public static void main(string[] args){ String ss01 = "Hello World"; String ss02; StringBuffer sb; sbの保存している文字列を ss02の内容に ss02=ss01.touppercase(); sb=new StringBuffer(ss ss02); sb.reverse(); System.out.println(sb); 10/40 5
プログラム例 public class Sample08f{ public static void main(string[] args){ String ss01 = "Hello World"; String ss02; StringBuffer sb; sb.reverse() はsbが保存している文字列を逆順にする ss02=ss01.touppercase(); sb=new StringBuffer(ss02); sb.reverse(); sbに保存されている文字列は System.out.println(sb); HELLO WORLDから DLROW OLLEHに StringBufferクラスのメソッドは 保存している文字列自体を変更できることに注意 11/40 プログラム例 public class Sample08f{ public static void main(string[] args){ String ss01 = "Hello World"; String ss02; StringBuffer sb; ss02=ss01.touppercase(); sb=new StringBuffer(ss02); sb.reverse(); System.out.println println(sb sb); ); コンソールに DLROW OLLEH と表示される 12/40 6
前回の課題 その 2: Sample08a.java ~ Sample08e.java をコンパイルして実行しなさい webに答えがあがっているのでえがあがっているので 各自各自で見ておくことておくこと 13/40 例外処理 14/40 7
例外処理とは? エラーが発生したとき 例外処理を行う機能があります エラーは 色々な場面で起こる可能性があります 例 : ファイルをオープンしようとしたら そのファイルが無い! ある文中でエラーが発生したら そのエラーに応じて 何らかの処理を行うことができます 文 エラー 01 発生 例外処理その 1 正常に終了 エラー 02 発生例外処理その 2 次の文 15/40 Java と例外 エラーが起きたときに行う例外処理を 必ず書かなければならないものがあります チェック例外と呼ばれます 書かれていないと コンパイル時にエラーがでます チェック例外が発生する可能性があるメソッドは 必ず 例外処理も書かなければなりません エラーが起きたときに行う例外処理を 書く必要がないものもあります 非チェック例外と呼ばれます 16/40 8
例外処理の書き方 try と catch そして finally を使って行います // // 例外を検出する文を書く catch ( 例外のタイプその 1 変数変数 ){ ){ // // 例外が発生したときに行う文を書く catch ( 例外のタイプその 2 変数変数 ){ ){ // // 例外が発生したときに行う文を書く finally{ // // エラーの有無 種類にかかわらず // // 必ず実行する文を書く 17/40 例外処理の流れ try{ // 文 エラー 01 発生 catch ( 例外のタイプその 1 変数 ){ // 文 正常に終了 エラー 02 発生 catch ( 例外のタイプその 2 変数 ){ // 文 finally{ // 文 18/40 9
try について try の中には 例外処理が発生する可能性がある文を書きます // // 例外を検出する文を書く 例外処理を必ず書かなければならないメソッドは try の中に書く必要があります 例外が発生した場合 ただちに catch の内容が実行されます 19/40 catch について catch の中には try で発生した例外処理に対して どのような処理を行うかを記述します catch ( 例外のタイプその 1 変数変数 ){ ){ // // 例外が発生したときに行う文を書く catch ( 例外のタイプその 2 変数変数 ){ ){ // // 例外が発生したときに行う文を書く 発生する例外のタイプに対して それぞれ 行う処理を記述することができます 実際には 例外のタイプはクラスになっています 変数には エラーの原因などが格納されます 20/40 10
例外のタイプ 例外のタイプはクラスになっています これらのものは Error クラスをスーパークラスにするもの Exception クラスをスーパークラスにするものの 2 種類があります 例外を自作することもできますが この授業ではやりません 21/40 finally について finally の中には 例外処理発生する しないに関わらず 必ず実行される文を書きます finally{ // // エラーの有無 種類にかかわらず // // 必ず実行する文を書く catchの中に return などの処理を停止する命令があったとしても finallyは必ず実行実行されます 22/40 11
サンプルプログラムその 1 import java.io.*; public class Sample09a{ FileReader fr fr = new new FileReader("test.txt"); catch(filenotfoundexception return; System.out.println("END"); FileReader fr = new FileReader("test.txt"); は ファイル test.txt を開く命令です 23/40 サンプルプログラム解説 import import java.io java.io io.*; io.*; ファイルの入出力をするためには パッケージjava.ioに含まれるメソッドが必要なので 今回はインポートした public class Sample09a{ FileReader fr fr = new new FileReader("test.txt"); catch(filenotfoundexception return; System.out.println("END"); 24/40 12
サンプルプログラム解説 import java.io.*; try 文の中に関して 例外処理が発生するかを監視する public class Sample09a{ try{ try{ FileReader FileReader fr fr = new new FileReader("test.txt"); ("test.txt"); catch(filenotfoundexception return; System.out.println("END"); FileReader fr = new FileReader("test.txt"); は ファイル test が存在しないとき FileNotFoundException という例外処理を起こす 25/40 サンプルプログラム解説 import java.io.*; public class Sample09a{ FileReader fr fr = new new FileReader("test.txt"); catch(filenotfoundexception FileNotFoundException System.out.println println("error:"+ ("Error:"+ e); e); return; return; System.out.println("END"); FileNotFoundExcept ion の例外処理が発生したときの処理内容を書く エラーの原因などは e に保存される 26/40 13
サンプルプログラム解説 import java.io.*; public class Sample09a{ FileReader fr fr = new new FileReader("test.txt"); catch(filenotfoundexception FileNotFoundException System.out.println println("error:"+ ("Error:"+ e); e); return; return; System.out.println("END"); エラーの原因を出力し 終了する 27/40 サンプルプログラムその 2 コンパイル時にエラーが出る例 : import java.io.*; public class Sample09b{ FileReader fr fr = new new FileReader("test.txt"); new FileReader("test.txt"); は キャッチ例外 FileNotFoundException を伴うので 必ず例外処理を書かなければいけません 書かなかった場合 コンパイル時にエラーがでます 28/40 14
サンプルプログラムその 3 import java.io.*; public class Sample09c{ FileReader fr fr = new new FileReader("test.txt"); catch(filenotfoundexception finally{ finally{ System.out.println println("finally"); ("FINALLY"); System.out.println("END"); finally はエラーの有無にかかわらず 必ず実行される 29/40 サンプルプログラムその 4 import java.io.*; public class Sample09d{ FileReader fr fr = new new FileReader("test.txt"); catch(filenotfoundexception return return ; finally{ finally{ System.out.println println("finally"); ("FINALLY"); System.out.println("END"); finally はエラーの有無にかかわらず 必ず実行される 30/40 15
サンプルプログラムその 5 import java.io.*; public class Sample09e{ try{ try{ FileReader fr fr = new new FileReader("test.txt"); fr.close(); catch(filenotfoundexception FileNotFoundException return ; catch(ioexception IOException return ; try の中には 例外を発生させる可能性がある文を 2 つ以上書ける tryの中で発生する可能性のある例外それぞれに catchを書ける 31/40 Exception 例外 複数の例外が発生する場合は 基本的に catch を複数書くことで対応します 同じスーパークラスに属する例外に対しては まとめて書くことができます 例えば Exception をスーパークラスにする例外に対しての catch は まとめて catch(exception // // 文 のように書くことができます 32/40 16
サンプルプログラムその 6 Sample09e 中の FileNotFoundException と IOException は 両方 Exc eption クラスをスーパークラスに持つので まとめて書いてみると import java.io.*; public class Sample09f{ FileReader fr fr = new new FileReader("test.txt"); fr.close(); catch(exception catch(exception return ; Exceptionをスーパークラスにする例外に対して まとめて対応 33/40 スロー あるメソッド中でエラーが発生したとき 例外処理を メソッドを呼び出したメソッド中で処理することができます 行いたい場合 メソッドを宣言するときに throws 例外のタイプ 1, 1, 例外のタイプ 2, 2, を書きます 例えば public static void void exctst() throws throws FileNotFoundException FileNotFoundException { FileReader ft ft = new new FileReader("test.txt"); System.out.println("File Open"); のように書きます ここで try を書く必要はありません 34/40 17
スロー スローを書いたメソッドを呼び出したメソッド側では 例外処理を書く必要があります スローを書いたメソッドを使用する場合は try の中で使用し 例外処理の内容を catch の中に書きます 例えば 1 ページ前のメソッド exctst を使う場合 exctst(); catch(filenotfoundexception return ; のように書きます 35/40 サンプルプログラムその 7 import java.io.*; public class Sample09g{ try{ try{ exctst(); exctst(); catch(filenotfoundexception FileNotFoundException return ; 例外処理をスローしてくるメソッド exctst を使用するので try と catch が必要 例外処理は 呼び出し元のメソッドにスロー public static void void exctst() throws throws FileNotFoundException{ FileReader ft ft = new new FileReader("test.txt"); System.out.println("File Open"); 36/40 18
非 catch 例外について 非キャッチ例外の例としては 0 で除算を行う ArithmeticEception 例外が発生 配列のサイズをオーバーしてアクセスする ArrayIndexOutOfBoundsException 例外が発生 等があります catch を必ずしも書く必要はありません コンパイル時にエラーを出しません 37/40 サンプルプログラムその 8 public class Sample09h{ int[] int01 = {1,2,3,4,5,6,7,8,9,10; int int int02=5; int02=5; System.out.println(500/int02); System.out.println(int01[int02]); catch(exception return; 38/40 19
非 catch 例外とスロー 非キャッチ例外をスローするメソッドを書く場合 メソッドを書くときに throws 例外のタイプを書く必要はありません 書いても構いません 39/40 サンプルプログラムその 9 public class Sample09i{ test(); catch(exception return; public static void void test(){ int[] int01 = {1,2,3,4,5,6,7,8,9,10; int int int02=5; System.out.println(500/int02); System.out.println(int01[int02]); スローが書かれていない 40/40 20