finally ブロック
CoddyのJavaジャーニー「ロジックとフロー」セクションの一部。レッスン 41/59。
finally ブロックには、例外が発生したかどうかにかかわらず、try-catch ブロックの後に実行されるコードが含まれます。これは、ファイルやデータベース接続を閉じるなどのクリーンアップ処理によく使用されます。
try-catch-finallyブロックの基本構造は次のとおりです。
try {
// 例外をスローする可能性のあるコード
} catch (ExceptionType e) {
// 例外を処理するコード
} finally {
// 常に実行されるコード
}カウンターを使った例を見てみましょう:
int counter = 0;
try {
int result = 10 / 0;
// これは例外をスローします
counter = 1;
} catch (ArithmeticException e) {
counter = 2;
} finally {
counter = 3;
// これは常に実行されます
}上記のコードを実行すると、counter には次の値が含まれます:
3
catch の括弧内の型によって、そのブロックが処理するエラーが決まります。よくあるものとして、整数を 0 で割ると発生する ArithmeticException と、テキストが数値でないときに Integer.parseInt() によって発生する NumberFormatException があります。1つの catch で複数の型を同時に処理できます:
try {
int value = Integer.parseInt(text);
int result = 10 / value;
} catch (ArithmeticException | NumberFormatException e) {
// 両方を処理する
} finally {
// 常に実行される
}代わりに Exception を捕捉すると、より広範囲になります。これら2つと、その他の例外も処理します。
チャレンジ
簡単processNumberという名前のメソッドを作成し、2つの引数を受け取るようにします。
- 整数に変換するString(
number) - 例外をスローするかどうかを決定するboolean(
shouldThrow)
メソッドは次のように動作します。
- result変数を0で初期化する
- tryブロック内で
- shouldThrowがtrueの場合、10を0で割る
- それ以外の場合、number文字列を整数に変換してresultに格納する
- catchブロック内で、resultを-1に設定する
- finallyブロック内で、resultに100を加える
- resultを文字列として返す
自分で試してみよう
import java.util.Scanner;
public class Main {
public static String processNumber(String number, boolean shouldThrow) {
// ここにコードを書いてください
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String number = scanner.nextLine();
boolean shouldThrow = Boolean.parseBoolean(scanner.nextLine());
System.out.println(processNumber(number, shouldThrow));
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Javaオンラインコンパイラ