【Java】例外処理(Try-Catch、throw、throws、finally)について解説
Javaコードを実行すると、さまざまな例外が発生する可能性があります。
ネットワーク接続の問題、ユーザーからかと言っての不適切な入力、プログラム内に存在しないファイルを開くなど
いくつかの理由で発生する可能性があります。
例外は、プログラム、すなわち実行中に発生した「不要なまたは予期しないイベント」であり
実行時に、そのプログラムの指示の通常の流れを中断させます。
今回は、プログラムの実装中に例外が発生した場合の例外処理について解説していきます。
try-catch文の書き方
宣言の仕方
Try-Catch文の構文は次のように宣言します。
1 2 3 4 5 6 |
try { // 通常実行される処理 } catch(Exception e) { // 例外発生時に実行される処理 } |
try:tryブロックには、例外が発生する可能性のあるステートメントのセットが含まれています。
catch:Catchブロックは、tryブロックの不確実な状態を処理するために使用されます。
tryブロックの後には常にcatchブロックが続きます。
catchブロックは、関連するtryブロックで発生する例外を処理します。
try-CatchにはtryとCatchだけでなく他にもキーワードが存在します。
throw:Throwキーワードは、tryブロックからcatchブロックに制御を移すために使用されます。
throws:Throwsキーワードは、try&catchブロックなしの例外処理に使用されます。
メソッドが呼び出し元にスローできる例外を指定し、それ自体は処理しません。
finally:catchブロックの後に実行されます。
複数のcatchブロックがある場合、基本的にはいくつかの一般的なコードを配置するために使用します。
言葉だけではわかりにくいと思いますので、ここで例を見てみましょう。
例
1 2 3 4 5 6 |
public class Main { public static void main(String[ ] args) { int[] myNumbers = {1, 2, 3}; System.out.println(Numbe[8]); } } |
出力結果
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 8
at ファイル名と行数
Numbers[8](配列の9番目)が存在しないため、これはエラーを生成します。
もう一つ例を見てみましょう。次はtry-catchを記載します。
エラーが発生した場合は、try-catchを使用してエラーをキャッチし、
コードを実行して処理します。
例
1 2 3 4 5 6 7 8 9 10 |
public class Main { public static void main(String[ ] args) { try { int[] Numbers = {1, 2, 3}; System.out.println(Numbers[8]); } catch (Exception e) { System.out.println("エラーだよ。"); } } } |
出力結果
エラーだよ。
tryブロックで例外が発生した場合、実行の制御は対応するcatchブロックに渡されます。
1つのtryブロックに複数のcatchブロックを関連付けることができます。
一般的な例外ハンドラーのcatchブロックが最後になるように、catchブロックを記載する必要があります。
throw、throws、finallyを使って使ってtry-catchを実装してみる
先ほどtry-catchを実装してみましたので、残りの
throw、throws、finallyをtry-catchでそれぞれ実装してみます。
throw
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Main { public static void main(String[] args) { try { int i = 0; if (i != 0) { System.out.println("iは0ではありません。"); } else { throw new IllegalArgumentException("throwされます。"); } } catch (IllegalAccessException e) { System.out.println("キャッチ中。"); } } } |
出力結果
Exception in thread “main” java.lang.IllegalArgumentException: throwされます。
at ファイル名と行数
throws
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class ThrowsSample { static void fun() throws IllegalAccessException { System.out.println("Inside fun(). "); throw new IllegalAccessException("demo"); } // This is a caller function public static void main(String args[]) { try { System.out.println("トライ中。"); } catch (IllegalAccessException e) { System.out.println("メインでキャッチ。"); } } } |
出力結果
トライ中。
メインでキャッチ。
finally
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class Division { public static void main(String[] args) { int a = 10, b = 5, c = 5, result; try { result = a / (b - c); System.out.println("result" + result); } catch (ArithmeticException e) { System.out.println("キャッチの例外:ゼロによる除算"); } finally { System.out.println("最後のブロックです。"); } } } |
出力結果
キャッチの例外:ゼロによる除算
最後のブロックです。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。