こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。
Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。久しぶりの更新になってしまいました。今回は例外がテーマです。例外の基本的な内容を一通り確認できる問題構成となっています。ぜひ普段の学習にお役立てください。
一般的なJavaの学習順序に沿ったテーマの一覧(※随時追加)は、こちらのリンクよりご確認頂けます。

Javaのトピックスです。主に初心者向けにプログラミング学習ネタを提供していきます。
解説動画
2023/06/19 解説動画を掲載しました。
問題編
Q001
問題
下の仕様に基づいてプログラムを修正し、実行結果の各パターンを得てください。
(仕様)
提供コードで発生する可能性のある例外に対して次のように処理します。
- java.lang.ArrayIndexOutOfBoundsExceptionが発生した場合
 「引数の数が足りません」と表示します。
- java.lang.NumberFormatExceptionが発生した場合
 「引数はそれぞれ数値でなければいけません」と表示します。
提供コード
public class Main{
    public static void main(String[] args){
        int x = Integer.parseInt(args[0]);
        int y = Integer.parseInt(args[1]);
        System.out.println(x+y);
    }
}
実行結果(実行時コマンド含む)
パターン1
>java Main 引数の数が足りません
パターン2
>java Main a b 引数はそれぞれ数値でなければいけません
パターン3
>java Main 5 8 13
Q002
問題
下の仕様に基づいてプログラムを修正し、実行結果の各パターンを得てください。
(仕様)
提供コードで発生する可能性のある例外に対して次のように処理します。
- java.lang.ArithmeticExceptionが発生した場合
 「不正な計算を行いました」と表示します。
- 上記以外の例外が発生した場合
 「引数は2つの数値を指定してください」と表示します。
- 例外発生の有無に関わらず、最後に「プログラムを終了します」と表示する
提供コード
public class Main{
    public static void main(String[] args){
        int x = Integer.parseInt(args[0]);
        int y = Integer.parseInt(args[1]);
        System.out.println(x/y);
    }
}
実行結果(実行時コマンド含む)
パターン1
>java Main 引数は2つの数値を指定してください プログラムを終了します
パターン2
>java Main 5 0 不正な計算を行いました プログラムを終了します
パターン3
>java Main 10 5 2 プログラムを終了します
Q003
問題
下の仕様に基づいてプログラムを修正し、実行結果を得てください。
(仕様)
提供コードで発生する可能性のある例外に対して次のように処理します。
- 
loadFileメソッド - throws宣言を使って、java.io.FileNotFoundExceptionが発生することを明示します。
 
- 
mainメソッド - java.io.FileNotFoundExceptionが発生した場合
 「ファイルを読込できません」と表示します。
 
- java.io.FileNotFoundExceptionが発生した場合
提供コード
import java.io.FileReader;
import java.io.FileNotFoundException;
public class Main{
    public static void main(String[] args){
    	loadFile();
    }
    public static void loadFile(){
    	FileReader fr = new FileReader("notfound.txt");
    }
}
実行結果(実行時コマンド含む)
パターン1(同一フォルダ内にnotfound.txtが無い場合)
>java Main ファイルを読込できません
パターン2(同一フォルダ内にnotfound.txtがある場合)
>java Main
※実行結果には何も表示されません。
Q004
問題
下の仕様に基づいて各メソッドを修正し、実行結果の各パターンを得てください。
(仕様)
- 
getBMIメソッド - 概要:身長(m)と体重(kg)からBMI値を求めます。
- 引数:
- weight:int型 体重(kg)
- height:double型 身長(m)
 
- 戻り値:double型 BMI値
- 処理詳細:
- BMI = 体重÷(身長×身長)の式に当てはめ、BMI値を求めます。
- 引数に負の数が与えられた場合は、java.lang.IllegalArgumentExceptionを発生させ、呼び出し元にスローします。
 メッセージは「負の数を用いることはできません」とします。
 
 
- 
mainメソッド - java.lang.IllegalArgumentExceptionが発生した場合
 例外インスタンスのgetMessageメソッドを呼び出して取得した値を表示します。
- それ以外の例外が発生した場合
 「2つの数値を指定してください」と表示します。
 
- java.lang.IllegalArgumentExceptionが発生した場合
提供コード
public class Main{
    public static void main(String[] args){
        double weight = Double.parseDouble(args[0]);
        double height = Double.parseDouble(args[1]);
        System.out.println( "BMI = " + getBMI(weight,height) );
    }
    public static double getBMI(double weight, double height){
        return weight / ( height * height );
    }
}
実行結果(実行時コマンド含む)
パターン1
>java Main 2つの数値を指定してください
パターン2
>java Main -50 -100 負の数を用いることはできません
パターン3
java Main 65 1.7 BMI = 22.49134948096886
Q005
問題
下の仕様に基づいて各クラスの作成・修正をし、実行結果の各パターンを得てください。
(仕様)
業務上のエラーを表すクラスBusinessExceptionクラスを作成します。Exceptionクラスを継承して作成します。
- コンストラクタの作成
- message:String型 エラーメッセージ
- 処理内容:引数messageの値を、親クラスのコンストラクタの引数にして実行します。
 
製品を表すProductクラスを作成します。
- フィールド
- name:String型 商品名を表します。
- price:int型 価格を表します。
 
- コンストラクタ
- 引数
- name:String型
- price:int型
 
- 処理内容:引数で与えられた値を、同名のフィールドに代入します。
 
- 引数
- toStringメソッド
- 引数:なし
- 戻り値:String型
- 処理内容:name、priceフィールドを用いて「XXXX:YYY円」と表示します。
 ※ XXXXはnameフィールド、YYYはpriceフィールドを表します。
 
製品を管理するProductManagerクラスを修正します。
- searchProductメソッド
- 修正内容:引数で指定した名前の商品が存在しない場合、nullを返す代わりに、BusinessExceptionをthrowします。メッセージは「該当する商品がありません」とします。
 
提供コード
(ProductManager.java)
public class ProductManager{
    public static Product[] products = {
        new Product("りんご",150),
        new Product("みかん",200),
        new Product("バナナ",100),
        new Product("ぶどう",250),
        new Product("キウイ",150),   
    };
    public static Product searchProduct( String name ){
        for( int i = 0; i < products.length; i++){
            if( products[i].name.equals(name) ){
                return products[i];
            }
        }
        //商品が存在しない。
        return null;
    }
}
(Main.java)
public class Main{
    public static void main(String[] args){
        try{
            System.out.println( ProductManager.searchProduct("りんご") );
            System.out.println( ProductManager.searchProduct("メロン") );
        } catch( BusinessException e ){
            System.out.println( e.getMessage() );
        }
    }
}
実行結果
りんご:150円 該当する商品がありません
解答編
それでは、解答編です。
Q001
(Main.java)
public class Main{
    public static void main(String[] args){
        try{
            int x = Integer.parseInt(args[0]);
            int y = Integer.parseInt(args[1]);
            System.out.println(x+y);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("引数の数が足りません");
        } catch (NumberFormatException e) {
            System.out.println("引数はそれぞれ数値でなければいけません");
        }
    }
}
Q002
(Main.java)
public class Main{
    public static void main(String[] args){
        try{
            int x = Integer.parseInt(args[0]);
            int y = Integer.parseInt(args[1]);
            System.out.println(x/y);
        } catch (ArithmeticException e) {
            System.out.println("不正な計算を行いました");
        } catch (Exception e) {
            System.out.println("引数は2つの数値を指定してください");
        } finally {
            System.out.println("プログラムを終了します");
        }
    }
}
Q003
(Main.java)
import java.io.FileReader;
import java.io.FileNotFoundException;
public class Main{
    public static void main(String[] args){
    	try{
            loadFile();
    	} catch(FileNotFoundException e){
            System.out.println("ファイルを読込できません");
    	}
    }
    public static void loadFile() throws FileNotFoundException{
    	FileReader fr = new FileReader("notfound.txt");
    }
}
Q004
(Main.java)
public class Main{
    public static void main(String[] args){
        try{
            double weight = Double.parseDouble(args[0]);
            double height = Double.parseDouble(args[1]);
            System.out.println( "BMI = " + getBMI(weight,height) );
        } catch( IllegalArgumentException e ){
            System.out.println( e.getMessage() );
        } catch( Exception e ){
            System.out.println("2つの数値を指定してください");
        }
    }
    public static double getBMI(double weight, double height) throws IllegalArgumentException{
        if( weight <= 0 || height <= 0 ){
            throw new IllegalArgumentException("負の数を用いることはできません");
        }
        return weight / ( height * height );
    }
}
Q005
(Product.java)
public class Product{
    String name;
    int price;
    Product(String name, int price){
        this.name = name;
        this.price = price;
    }
    public String toString(){
        return this.name + ":" + this.price + "円";
    }
}
(BusinessException.java)
public class BusinessException extends Exception{
    public BusinessException(String message){
        super(message);
    }
}
(ProductManager.java)
public class ProductManager{
    public static Product[] products = {
        new Product("りんご",150),
        new Product("みかん",200),
        new Product("バナナ",100),
        new Product("ぶどう",250),
        new Product("キウイ",150),   
    };
    public static Product searchProduct( String name ) throws BusinessException{
        for( int i = 0; i < products.length; i++){
            if( products[i].name.equals(name) ){
                return products[i];
            }
        }
        throw new BusinessException("該当する商品がありません");
    }
}
おわりに
本日は以上となります。最後までご覧くださりありがとうございます。例外処理は業務システムではとても大事なスキルとなります。例外の基礎練習としてご活用ください。ひきつづき、問題の提供をしていければと思っています。今後もよろしくお願いいたします。
[PR]
Javaをもっと詳しく学びたい!という方には、下の書籍がおススメです!筆者も愛用しています。


 
  
  
  
  
