Javaプログラミング練習問題(例外)

Java

こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。

Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。久しぶりの更新になってしまいました。今回は例外がテーマです。例外の基本的な内容を一通り確認できる問題構成となっています。ぜひ普段の学習にお役立てください。

一般的な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が発生した場合
      「ファイルを読込できません」と表示します。

提供コード

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");
    }
}

実行結果(実行時コマンド含む)

>java Main
引数は2つの数値を指定してください
プログラムを終了します

Q004

問題

下の仕様に基づいて各メソッドを修正し、実行結果の各パターンを得てください。
(仕様)

  • getBMIメソッド

    • 概要:身長(m)と体重(kg)からBMI値を求めます。
    • 引数:
      • weight:int型 体重(kg)
      • height:double型 身長(m)
    • 戻り値:double型 BMI値
    • 処理詳細:
      • BMI = 体重÷(身長×身長)の式に当てはめ、BMI値を求めます。
      • 引数に負の数が与えられた場合は、java.lang.IllegalArgumentExceptionを発生させ、呼び出し元にスローします。
        メッセージは「負の数を用いることはできません」とします。
  • mainメソッド

    • java.lang.IllegalArgumentExceptionが発生した場合
      例外インスタンスのgetMessageメソッドを呼び出して取得した値を表示します。
    • それ以外の例外が発生した場合
      「2つの数値を指定してください」と表示します。

提供コード

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)

public class Main{
    public static void main(String[] args){
        try{
            int x = Integer.parseInt(args[0]);
            int y = Integer.parseInt(args[1]);
            warizan(x,y);
        } catch( ArithmeticException e ){
            System.out.println("不正な計算を行いました");
        } catch( Exception e ){
            System.out.println("引数は2つの数値を指定してください");
        }
    }
    public static void warizan( int x, int y ) throws ArithmeticException {
        System.out.println(x/y);
    }
}   

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("該当する商品がありません");
    }
}

おわりに

本日は以上となります。最後までご覧くださりありがとうございます。例外処理は業務システムではとても大事なスキルとなります。例外の基礎練習としてご活用ください。ひきつづき、問題の提供をしていければと思っています。今後もよろしくお願いいたします。


合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

ECFエデュケーション
タイトルとURLをコピーしました