練習問題
8.5 練習問題
本章で習った内容を元に練習問題を解いてください。
問1 次の設問①~⑤について○か×で答えなさい。
設問
① 例外が発生すると必ずcatchブロックが処理される。
② 例外が発生していない場合でも、必ずfinallyブロック内の処理は実行される。
③ catchブロックは複数設定できるので、catchブロックに指定する例外クラスの並びは特に気にする必要はない。
④ catchの「()」括弧内に指定した変数名を利用すると、例外の詳細な情報を取得できる。
⑤ 例外処理を組み込むとソースコードが煩雑になるので、どんな例外も絶対に処理する必要はない。
問2 以下に示すソースコードを実行した結果として正しいものを答えなさい。
選択肢
① Redのみ画面に表示される。
② Red、Blue、Yellow、Pink、Black全て表示される。
③ Red、Blue、Pink、Blackが表示される。
④ Yellowのみ画面に表示される。
⑤ Red、Blue、Yellow、Pinkが表示される。
⑥ Blackのみ画面に表示される。
① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch08exercise
③ 名前: Color
④ 作成するメソッド・スタブの選択: public static void main(String[] args) にチェックを入れる
package jp.co.f1.basic.ch08exercise;
public class Color {
public static void main(String[] args) {
System.out.println("Red");
try {
int[] array = new int[2];
System.out.println("Blue");
array[2] = 88;
System.out.println("Yellow");
} catch (Exception e) {
System.out.println("Pink");
} finally {
System.out.println("Black");
}
}
}
問3 以下に示すSample.javaのソースコードを実行した場合、発生する可能性のある選択肢の例外を○か×で答えなさい。
選択肢
① ファイル入出力エラー(IOexception)
② 0除算エラー(ArithmeticException)
③ 配列エラー(ArrayIndexOutOfBoundsException)
④ 型変換エラー(NumberFormatException)
⑤ キーボード入力値のエラー(InputMismatchException)
① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch08exercise
③ 名前: Sample
④ 作成するメソッド・スタブの選択: public static void main(String[] args) にチェックを入れる
package jp.co.f1.basic.ch08exercise;
import java.util.*;
public class Sample {
public static void main(String[] args) {
int cnt = 0; // 入力数
int sum = 0; // 合計点
int ave = 0; // 平均点(少数点以下は切捨て)
int[] num = new int[3]; // 入力数値を格納する配列
Scanner sin = new Scanner(System.in); // Scannerクラスをオブジェクト化
// 繰り返し処理(配列の要素数分)
while (true) {
// キーボードより数値を入力し配列に格納
System.out.print("数値を入力して下さい。(999で強制終了)>");
int tmpNum = sin.nextInt();
// 入力数値が999なら強制でループを抜ける
if (tmpNum == 999) {
break;
}
num[cnt] = tmpNum; // 配列にデータを格納する
cnt++; // 入力数をカウントアップ
}
// 繰り返し処理(配列の要素数分)
for (int i = 0; i < cnt; i++) {
// 入力数値を合計点へ加算
sum += num[i];
}
// 平均点を計算
ave = sum / cnt;
// 各結果を画面に出力
System.out.println("入力数は" + cnt + "です。");
System.out.println("合計点は" + sum + "です。");
System.out.println("平均点は" + ave + "です。");
}
}
問4 問3のSample.javaを実行して、キーボードから整数文字以外を入力すると例外が発生します。整数文字以外が入力された際には、以下の実行結果になるPractice0801.javaを作成しなさい。作成する場合はSample.javaのソースコードを利用し、変更仕様に従って下さい。
ソースコード① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch08exercise
③ 名前: Practice0801
④ 作成するメソッド・スタブの選択: public static void main(String[] args) にチェックを入れる
実行結果(Sample.java)
- 繰り返し処理内に例外処理(try~catch)を追加し、再度キーボード入力を行えるようにする。
- tryブロック内に含める処理は、whileブロック内全ての処理を含める。
- catchする例外はInputMismatchExceptionを指定する。
- catchブロック内の処理は、以下のメッセージを画面に出力し、入力バッファのクリアを行う。
①「文字が入力されました。整数を入力して下さい。」
②入力バッファのクリア(sin.next();)
※「バッファ」とは、入出力を効率よく行うために「データを一時的に溜めておく仕組み」です。実際には「配列」等のデータ構造を使って実現されていますが、学習の段階では「入力や出力の途中にデータを待機させる仕組み」と理解すれば十分です。例えばキーボード入力の場合、文字を押した瞬間にプログラムが直接受け取るのではなく、まずバッファに溜めてからプログラムが順番に読み取ります。
※入力バッファには、Enterを押すまでに入力した文字が格納されます。入力処理でnextInt()やnextDouble()などの数値入力メソッドを使った場合、不正な値を入力すると例外が発生します。このとき、入力バッファにはエラーとなった文字列全体が残ってしまいます。もしそのまま次の入力処理に進むと、次の入力より先に、再度同じ不正なデータを読み取ってしまい、無限に例外が繰り返される可能性があります。これを防ぐためには、例外処理の中でnext()やnextLine()を使って、入力バッファに残っている不要なデータを明示的に読み捨て、バッファを空にする必要があります。そうすることで、次の入力を正しく受け付けられるようになります。

実行結果(Practice0801.java)
作成ポイント
問5 問4でキーボード入力値に関する例外は処理しましたが、それ以外にも以下に示す例外が発生します。
- 1人も入力せずに終了した場合:0除算の例外
- 4回以上入力した場合:最大配列要素数越えの例外
上記を対処するあらゆる例外を処理するような例外処理を組み込んだPractice0802.javaを作成しなさい。
問4で作成したソースコードを利用し、変更仕様に従って作成して下さい。
実行結果① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch08exercise
③ 名前: Practice0802
④ 作成するメソッド・スタブの選択: public static void main(String[] args) にチェックを入れる
・1人も入力せずに終了した場合

・4回以上入力した場合

- tryブロックに含める処理は、main関数内全ての処理を含める。
- catchする例外はExceptionを指定する。
- catchブロック内の処理は、例外の詳細情報を画面に出力する。
→「xxxxという例外が発生しました。」
※xxxx=例外の詳細情報
package jp.co.f1.basic.ch08exercise;
import java.util.*;
public class Sample {
public static void main(String[] args) {
try{
main関数の処理全て
}catch(・・・){
例外発生時に行う処理
}
}
}