Javaのcatchブロックやfinallyブロックでreturn文は使える?使い方と注意点を解説
はい、Javaではcatchブロックやfinallyブロックの中にメソッドのreturn文を記述することができます。
ここでは、それぞれのブロックでreturn文を使う際の動作と注意点について詳しく解説します。
return文の基本的なルール
- メソッドが戻り値の型を持つ場合、条件に応じてメソッド内の任意の場所で値を返すことができます。
- catchブロックで値を返し、さらにメソッドの末尾でも値を返す場合、コードは正常にコンパイル・実行されます。
- catchブロックで値を返した後に、メソッドの末尾へ追加のコードを記述した場合、その部分は決して実行されない「到達不可能なコード(unreachable code)」となります。Javaは到達不可能なコードをサポートしていないため、コンパイルエラーが発生します。
- finallyブロックで値を返す場合、メソッドの末尾で改めて戻り値を返す必要はありません。ただし、finallyブロックのreturnはtryやcatchブロックの戻り値を上書きするため、意図しない結果を招く可能性がある点に注意しましょう。
例1:catchブロックでのreturn
次の例では、0による除算で例外が発生するため、catchブロック内のreturn文が実行され、「1」が返されます。
public class CatchReturn {
int calc() {
try {
int x = 12 / 0;
} catch (Exception e) {
return 1;
}
return 10;
}
public static void main(String[] args) {
CatchReturn cr = new CatchReturn();
System.out.println(cr.calc());
}
}出力
1
例2:finallyブロックでのreturn
次の例では、tryブロックで「10」を返そうとしていますが、finallyブロックのreturn文が最後に必ず実行されるため、結果は「30」で上書きされます。
public class FinallyReturn {
int calc() {
try {
return 10;
} catch (Exception e) {
return 20;
} finally {
return 30;
}
}
public static void main(String[] args) {
FinallyReturn fr = new FinallyReturn();
System.out.println(fr.calc());
}
}出力
30
まとめ
catchブロックやfinallyブロックでもreturn文は有効ですが、特にfinallyブロックでのreturnは例外発生時の処理フローを隠蔽したり、本来返すべき値を上書きしたりする原因となるため、実務では避けるのが一般的です。可読性と保守性を高めるためにも、return文はメソッドの末尾または適切な分岐内で使用することをおすすめします。
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。
-
JavaでJComboBoxの項目をソートする方法!DefaultComboBoxModelのカスタマイズ例
JComboBoxはJComponentクラスのサブクラスであり、テキストフィールドと、ユーザーが値を選択できるドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーがコンボボックスを操作すると、ActionListener、ChangeListener、ItemListenerといったインターフェースを通じてイベントを受け取ることができます。 ただし、標準のJComboBoxにはアイテムを並べ替える(ソートする)機能は用意されていません。そこで本記事では、DefaultComboBoxModelクラスを継承した独自のモデルクラスを作成し、コンボボックスの項目を常に整序された