こんにちは。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("該当する商品がありません"); } }
おわりに
本日は以上となります。最後までご覧くださりありがとうございます。例外処理は業務システムではとても大事なスキルとなります。例外の基礎練習としてご活用ください。ひきつづき、問題の提供をしていければと思っています。今後もよろしくお願いいたします。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。