まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(StepFinal)
問題のポイント
- 1件でも落ちたら全部止まる──そんな処理は現場じゃ通用しない。
- すべてのデータを “1件ずつ try-catch” で安全に処理する構造を組め。
- 失敗はログに残す、成功は通常処理を続ける。これが「エラーに強いコード」の鉄則や。
まず、日本語で考えろ
文字列の配列 {"20", "0", "abc", "10"}
をもらったとする。
これを全部 int
に変換して、100 / 変換後の値
をしたい。
でもな:
"abc"
は変換できへん(→NumberFormatException
)"0"
はゼロ除算(→ArithmeticException
)
じゃあどうする?
1件ずつ try-catch で囲って、何があっても止まらずに全部処理してみせろ。
コメントを書け
// String型の配列をループし、1件ずつ数値に変換して割り算を行う
// NumberFormatException → 数値に変換できなかった
// ArithmeticException → ゼロ除算
// それぞれに応じたエラーメッセージを出し、処理は止めずに続行する
コメントに従ってコードを書け
public class ExceptionUtil {
public static void processData(String[] inputs) {
for (String input : inputs) {
try {
int value = Integer.parseInt(input);
int result = 100 / value;
System.out.println("入力 \"" + input + "\" の結果 → " + result);
} catch (NumberFormatException e) {
System.out.println("入力 \"" + input + "\" は数値に変換できませんでした");
} catch (ArithmeticException e) {
System.out.println("入力 \"" + input + "\" はゼロによる除算エラーです");
}
}
}
}
public class Main {
public static void main(String[] args) {
String[] inputs = {"20", "0", "abc", "10"};
ExceptionUtil.processData(inputs);
}
}
実行結果の例
入力 "20" の結果 → 5
入力 "0" はゼロによる除算エラーです
入力 "abc" は数値に変換できませんでした
入力 "10" の結果 → 10
コードの解説
for
文で1件ずつ処理し、try-catch を内部に仕込むことで、個別に例外処理を適用NumberFormatException
→"abc"
など、数値にできない文字列ArithmeticException
→"0"
を使った割り算- 例外が出ても次のループに進む=ロバスト(頑丈)な処理設計になっている
つまづきやすいポイント
- try-catch をループの外側に書いてしまうと、1件のエラーで全体が止まる
- catch を分けてないと、「どの例外だったか」区別できない
- 処理の継続とログの記録は、同時に両立できるように設計する必要がある
// tesh:
// 「落ちたら止まる」コードは、オモチャや。
// オレたちが書くのは「落ちても続ける」「痕跡を残して耐える」コードや。
//
// 耐えろ。握りつぶせ。前に進め。
// その力を、このFinalステップで仕上げろ。
//
// Just keep typing, baby.
// 例外処理は、コードの根性や。踏ん張りの設計を、構造で書け。