概要
例外処理の基本的な知識と操作について記載しています。
例外処理の構文
try~catch~finally
◆基本構文
1 2 3 4 5 6 7 8 |
// try~catch~finally try { // 例外が発生する可能性のある処理 catch (例外クラス型 変数) { // 例外発生時の処理内容 } finally { // 例外の発生有無に関わらず最後に実行される処理 } |
・finallyブロックは省略可能です。
・catchブロックは複数指定可能です。
・tryブロック , catchブロック , finallyブロックの順である必要があります。
・finallyブロックは必ず実行されます。(catch内でreturnしていても同様)
try~with~resource
◆基本構文
1 2 3 4 5 6 7 8 |
// try~with~resource try( // リソースの宣言) { // リソースの処理 catch (例外クラス型 変数) { // 例外発生時の処理内容 } finally { // 例外の発生有無に関わらず最後に実行される処理 } |
・例外発生時の処理順序です。
①リソースの解放
②catchブロックの処理
③finallyブロックの処理
検査例外・非検査例外・エラー
関係図
検査例外、非検査例外、エラーの関係を図で示します。
検査例外
ExceptionクラスのRuntimeException以外のクラスとそのサブクラスが検査例外です。
検査例外は、以下を強制します。
・try~catch句
・throws句
例として、以下のサブクラスがあります。
・IOException
・ClassNotFoundException
非検査例外
ExceptionクラスのRuntimeExceptionクラスとそのサブクラスが非検査例外です。
検査例外のような例外処理の強制はありません。
例として、以下のサブクラスがあります。
・ClassCastException
・NullPointerException
・IndexOutOfBoundsException
エラー
プログラムが回復不能なトラブルに陥った場合に発生します。
例として、以下がErrorのサブクラスです。
・OutOfMemoryError
・StackOverflowError
・NoClassDefFoundError
コード例
検査例外(try~catch~finally)
ファイルの読み込みに失敗した場合に例外処理するケース
1 2 3 4 5 6 7 8 9 10 11 |
// 検査例外 try { File file = new File("no exists path"); if(!file.canRead()) { throw new FileNotFoundException("ファイルの読込に失敗しました。"); } } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } finally { System.out.println("finallyが実行されました。"); } |
1 2 3 |
// コンソール出力 ファイルの読込に失敗しました。 finallyが実行されました。 |
検査例外(try~with~resource)
読込対象のファイルが存在しないため、リソースが開けないケース
1 2 3 4 5 6 7 8 9 10 |
// 検査例外(リソースエラー) try(FileInputStream fileIo = new FileInputStream("no exists path")) { System.out.println(fileIo.read()); } catch (IOException e) { // IOExceptionはFileNotFoundExceptionの親クラス // 例外の親クラスでもキャッチは可能 e.printStackTrace(); } finally { // 何もしなくてもいい } |
1 2 3 4 5 6 7 |
// コンソール出力 java.io.FileNotFoundException: no exists path (指定されたファイルが見つかりません。) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:219) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112) at exceptions.MainExceptions.main(MainExceptions.java:38) |
非検査例外(catchしない場合)
NullPointerExceptionをcatchしないケース
1 2 3 |
// 非検査例外(catchしない) String nullVal = null; nullVal.getBytes(); |
1 2 3 |
// コンソール出力 Exception in thread "main" java.lang.NullPointerException at exceptions.MainExceptions.main(MainExceptions.java:25) |
非検査例外(catchする場合)
NullPointerExceptionをcatchするケース
1 2 3 4 5 6 7 8 9 |
// 非検査例外(catchする) try { nullVal.getBytes(); } catch (NullPointerException e) { e.printStackTrace(); } finally { nullVal = ""; } System.out.println("nullVal = " + nullVal); |
1 2 3 4 |
// コンソール出力 java.lang.NullPointerException at exceptions.MainExceptions.main(MainExceptions.java:31) nullVal = |
エラー
無限ループでOutOfMemoryErrorが発生したケース
1 2 3 4 5 |
// エラー List<String> list = new ArrayList<String>(); while(true) { list.add("無限ループ"); } |
1 2 3 4 5 6 7 8 9 |
// コンソール出力 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.util.Arrays.copyOf(Arrays.java:3720) at java.base/java.util.Arrays.copyOf(Arrays.java:3689) at java.base/java.util.ArrayList.grow(ArrayList.java:238) at java.base/java.util.ArrayList.grow(ArrayList.java:243) at java.base/java.util.ArrayList.add(ArrayList.java:486) at java.base/java.util.ArrayList.add(ArrayList.java:499) at exceptions.MainExceptions.main(MainExceptions.java:53) |
まとめ
- 例外には、検査例外・非検査例外がある。
- 検査例外はtry~catchまたはthrowsが強制されるが、非検査例外では強制されない。
- エラーはシステムが回復不能である場合にスローされる。
コメント