質問: NoSuchFileException.class) public void NoSuchFileException_発生テスト() throws NoSuchFileException { throw new NoSuchFileException("test"); } ```
回答: Java の持つ、チェック例外(Checked exception) と非チェック例外(Unchecked exception) の違いです。基本的なところなので、ドキュメントも参照してください。 `RuntimeException` でない例外は、チェック例外とされ「メソッドで処理(`catch` または `throws`)されなければならない」としてコンパイラに扱われます。メソッドの中でチェック例外が発生したならば、`try...catch`で受け取るか、もしくは、 `throws` でメソッド自体が例外を投げることを宣言しなければコンパイルエラーとなります。 対して `RuntimeException` は、非チェック例外(実行時例外)です。例外が発生する事実がコンパイルに影響することはありません。そのかわり、例外処理のコーディングを忘れるなどで、意図しないところで実行時に例外が発生し、バグの元となる可能性があります。 NoSuchFileException: ``` -java.lang.Object -java.lang.Throwable -java.lang.Exception -java.io.IOException -java.nio.file.FileSystemException -java.nio.file.NoSuchFileException ``` NullPointerException: ``` -java.lang.Object -java.lang.Throwable -java.lang.Exception -java.lang.RuntimeException -java.lang.NullPointerException ``` `NullPointerException` は、非チェック例外、 `NoSuchFileException` はチェック例外です。 チェック例外・非チェック例外は、Java 初期から存在する機能ですが、時代が変わり、最近では、Java のチェック例外は、煩わしいものとして忌避されることが多くなりました。新しい他の言語で、この機能が導入されることは稀です。 ### コメント出た話題について追記: 使い分けについては Oracle のチュートリアルに言及があります。 Java Tutorial: Unchecked Exceptions — The Controversy: > > (適当訳) > > 実行時例外は、プログラミング上の問題の結果の現れであり、そんなものは、API > > 利用コードが復帰・対処できる事柄ではない。数値例外(ゼロ除算)、nullに対するアクセスによるポインタ例外、配列に対する大きすぎるまたは小さすぎるインデックス値指定などがそれらに該当する. > > ... > > 最低限のラインはこれだろう - 「(APIを利用する)クライアントプログラムが例外から復帰できるとされるなら、チェック例外としなさい。プログラムが例外から復帰するために何もできないならば、実行時例外としなさい。」 > > >