練習問題 解答

8.6 練習問題 解答

問1

① ×:対応する例外クラスがcatchブロックに設定されていないと処理は行われない。
② ○:finallyブロックは、例外発生の有無に関わらず必ず処理されます。
③ ×:例外クラスの下位クラスから上位クラスの順に並べないと、コンパイルエラーになります。
④ ○:変数から例外クラスの情報を取得することができます。
⑤ ×: 例外には必ず処理しないといけないチェック例外が存在します。

問2

③ 「Yellow」を表示する前の処理で例外が発生します。

問3

① ×:この例外が発生するクラスは利用していない。
② ○:入力数値が無い(1回目で999を入力)場合発生します。
③ ○:1つ目の繰り返し処理の条件が間違っているため、4回目の数値入力で発生します。
④ ×:型を変換するような処理を行っていない。
⑤ ○:intデータしかキーボード入力を受けつけないので、整数値以外を入力すると発生します。

問4

Practice0801.java
※例外処理を追加した部分のみを記載しています。その他問3のSample.javaと同じです。

  ・・・省略・・・

  // 繰り返し処理
  while(true){
    try{
      // キーボードより数値を入力し配列に入力
      System.out.print("数値を入力して下さい。(999で強制終了)>");
      int tmpNum = sin.nextInt();

      // 入力数値が999なら強制でループを抜ける
      if(tmpNum == 999){
        break;
      }
      num[cnt] = tmpNum; 	// 配列にデータを格納する
      cnt++; 		// 入力数をカウントアップ
    }catch(InputMismatchException e){
      System.out.println("→「文字が入力されました。整数を入力して下さい。」\n");
      // 入力バッファのクリア
      sin.next();
    }
  }
  ・・・省略・・・
  
解説

まずはwhileブロック内の処理全てをtryブロックで囲んでいます。そしてcatchの()内に処理する例外クラス「InputMismatchException」を指定しています。catchブロック内では画面にメッセージを出力し、「sin.next();」メソッドを利用してバッファのクリアを行っています。
catchブロックの処理が終っても処理自体がwhile内なので、繰り返し処理の先頭に戻り再入力を促します。

問5

Practice0802.java
※例外処理を追加した部分のみを記載しています。その他問題8-3のSample.javaと同じです。

  package jp.co.f1.basic.ch08exercise;

  import java.util.*;

  public class Practice0802 {
    public static void main(String[] args) {
      try{
        // 変数宣言
        int cnt = 0; // 入力数
        int sum = 0; // 合計点
        int ave = 0; // 平均点(少数点は切捨て)

        ・・・中略・・・

        // 各結果を画面に出力
        System.out.println("入力数は" + cnt + "です。");
        System.out.println("合計点は" + sum + "です。");
        System.out.println("平均点は" + ave + "です。");
      }catch(Exception e){
        System.out.println(e+"という例外が発生しました。");
      }
    }
  }
  
解説

まずはメインメソッド内の処理全てをtryブロックで囲んでいます。そしてcatchの()内に全ての例外を処理する例外クラス「Exception」を指定しています。catchブロック内では例外のオブジェクトを指し示す変数「e」を利用して、例外の詳細情報を画面に表示します。catch以降の処理は無いのでこのまま処理が終了します。

NEXT>> 9 クラスライブラリ