オブジェクト指向プログラミング 同演習 5 月 21 日演習課題 問題 1 配列の例外処理例外が発生する可能性のある処理を try で囲み その後に catch で例外を捕捉します 例外処理の終了処理として finally が行われます これは書かなくて自動的に行われます 提出課題 1 (Kadai052301.java) 以下のプログラムは例外処理をしていない ArrayIndexOutOfBoundsException の例外を捕捉し 更に 数以外のものが入力された場合の例外 ( NumberFormatException ) の処理を付け加えよ /* Kadai052101.java 整数値を入力して 合計値を出力する import java.lang.arrayindexoutofboundsexception; public class Kadai052301{ public static void main(string[] args) throws IOException { int[] array = new int[5]; BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); int ind = 0; int num = 0; while(true){ System.out.print(" 整数値を入力して下さい >>"); num = Integer.parseInt(buf.readLine()); array[ind] = num; ind++; $java Kadai052301 整数値を入力して下さい >>1 整数値を入力して下さい >>2 整数値を入力して下さい >>3 整数値を入力して下さい >>4 整数値を入力して下さい >>5 整数値を入力して下さい >>6 データ数が配列サイズを超えました合計値は 15 です 問題 2 入出力 Java には 外部からデータを受け取り処理をするためのパッケージが用意されています クラスを集めてたクラス群は パッケージと呼ばれます Java 言語は 似たようなクラスをパッケージごとに整理してまとめ クラスライブラリとして提供しています 入出力を行うクラスは 文字データと一般的なバイトデータに分かれます ここでは Write クラスと Reader クラスのサブクラスを扱います
入出力クラス 扱うデータ出力 入力 文字 Writer Reader バイト OutputStream InputStream 提出課題 2 (Kadai052302.java) 以下のサンプルプログラムは 標準入力から入力された 1 行のみをファイル名 outdata.txt に出力するプログラムである 標準入力で出力するファイル名を指定し zzzz が入力されるまで複数行の標準入力をよみこみファイルに出力できるように書き換えよ 但し ファイルに zzzz は出力しない /* Kadai052302.java 標準入力からデータを入力し 指定したファイル名にデータを出力する import java.io.printwriter; public class Kadai052302 { try { String fname = "outdata.txt"; PrintWriter pw = new PrintWriter(fname); String str; str = buf.readline(); pw.println(str); pw.close(); catch(ioexception e){ e.printstacktrace(); $java Kadai052302 書き込むファイル名を指定してください >>text.txt my name zzzz $more text.txt my name 問題 3 ファイルからデータを読み込み 標準出力するプログラム提出課題 3 (Kadai052303.java) ファイルからデータを読み込む場合は ファイルが存在しない場合 FileNotFoundException の例外が発生するため この例外を捕捉するための例外処理が必要になる 以下のプログラムは ファイル名 outdata.txt 指定し最初の 1 行を読み込んで終了する しかし 例外処理が入っていないのでコンパイル出来ない そこで FileNotFoundException IOException が捕捉出来るように例外処理を書き加えよ
/* Kadai052303.java ファイルからデータを取得し 指定したファイル名にデータを出力する import java.io.filereader; import java.io.filenotfoundexception; public class Kadai052303 { FileReader fr = new FileReader("outdata.txt"); BufferedReader br = new BufferedReader(fr); String str; str = br.readline(); System.out.println(str); br.close(); 問題 4 追加課題 (OKadai052301.java) 以下のプログラムは 2 つ数の計算をする電卓プログラムである以下の仕様になるように Calc.java に例外処理付け加えてプログラムを完成させよ プログラムは以下のものとする メインのクラス (Okadai052301.java) は 計算する式の入力を受けつけるメインプログラムは変更しない Calc クラス (Calc.java) は入力された文字列を処理し 演算を行い演算時の例外処理をする 演算子チェック部分で 演算子が入っていない場合に独自例外の OpException を発生する ゼロで割り算した場合は ArithmeticException の例外を生成し 捕捉できるようにする 入力が数でない場合は NumberFormatException 例外を捕捉する OpException クラス (OpException.java) は独自の例外クラスを定義する OpException クラスは変更しない /* ----------------------------------------------------- メインのクラス OKadai052301.java 四則演算を行うクラスを作成して 例外処理を行う演算クラスで 数を 2 つと演算子を 1 つ入力して演算子合わせた数の演算を行う ----------------------------------------------------- public class OKadai052301 { Calc calc = new Calc(); try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println(" ");
System.out.println( calc.arithmetic( br.readline() ) ); catch(ioexception e){ e.printstacktrace(); /* Calc.java ゼロ割した場合の処理を付け加える入力した式が不正な場合の独自例外を定義する d1, d2 : 入力された行を演算子の左右に分解したときの二つの数を代入する result : 計算結果を代入する変数 arithmetic(): 演算子をチェックして 二つの数と演算子に分解する public class Calc{ private String[] str; private d1,d2, result; Calc(){ d1=0.0; d2 =0.0; result=0.0; public double arithmetic(string input) { // 演算子のチェック char op_char = ' '; if ( input.indexof('*')!= -1) { op_char = '*'; else if ( input.indexof('/')!= -1) { op_char = '/'; else if( input.indexof('+')!= -1) { op_char = '+'; else if( input.indexof('-')!= -1) { op_char = '-'; else if(input.indexof('%')!=-1) { op_char = '%'; // 入力の演算子の前までの切り抜き str[0] = input.substring( 0, input.indexof(op_char)); // 入力の演算子の後ろから最後まで切り抜き str[1] = input.substring( input.indexof(op_char)+1, input.length() ); // 演算子の前と後ろの文字列を数値に置き換えて演算する d1 = Double.parseDouble(str[0]); d2 = Double.parseDouble(str[1]); switch(op_char) { case '*': result = d1*d2; case '/': result = d1/d2; case '+': result = d1+d2; case '-':
result = d1-d2; return result; /* OpException.java 独自の例外クラス演算子が入っていない場合に用いる class OpException extends Exception { String message; OpException(String message){ this.message = message; public void printmessage(){ System.out.println(message); 5*2 10.0 *0 正しく式を入力してください 0.0 10 演算子も入れてください 0.0 追加課題 (OKadai052302.java) Kadai052303.java を改良し ファイル名を指定してテキストファイルを最後まで自動的に読み込めるようにせよ ファイルの終端を調べるには br.readline()!= null とすると ファイルの終端かどうか判定できる