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