4868
`@Test`アノテーションに例外クラスを指定したのですが、`NoSuchFileException`はスロー宣言をしないとコンパイラに怒られます。  
`NullPointerException`は大丈夫なんですが、これはどうしてですか？

  * `NullPointerException`はスロー宣言が不要
```     @Test(expected = NullPointerException.class)

    public void NullPointerException_発生テスト() {
        throw new NullPointerException("test");
    }
    
```

  * `NoSuchFileException`はスロー宣言が必要
```     @Test(expected = NoSuchFileException.class)

    public void NoSuchFileException_発生テスト() throws NoSuchFileException {
        throw new NoSuchFileException("test");
    }
    
```
CC BY-SA 3.0
2015-01-20T00:46:30.090
4867
2015-01-20T02:07:11.820
7214
question
java junit
JUnit：@Testアノテーションに例外クラスを指定する際、NoSuchFileExceptionはスロー宣言が必要な理由
Java の持つ、チェック例外(Checked exception) と非チェック例外(Unchecked exception)
の違いです。基本的なところなので、[ドキュメント](http://docs.oracle.com/javase/jp/8/api/java/lang/RuntimeException.html)も参照してください。

`RuntimeException` でない例外は、チェック例外とされ「メソッドで処理(`catch` または
`throws`)されなければならない」としてコンパイラに扱われます。メソッドの中でチェック例外が発生したならば、`try...catch`で受け取るか、もしくは、
`throws` でメソッド自体が例外を投げることを宣言しなければコンパイルエラーとなります。

対して `RuntimeException`
は、非チェック例外（実行時例外）です。例外が発生する事実がコンパイルに影響することはありません。そのかわり、例外処理のコーディングを忘れるなどで、意図しないところで実行時に例外が発生し、バグの元となる可能性があります。

[NoSuchFileException](http://docs.oracle.com/javase/jp/8/api/java/nio/file/NoSuchFileException.html):

```

    -java.lang.Object
        -java.lang.Throwable
            -java.lang.Exception
                -java.io.IOException
                    -java.nio.file.FileSystemException
                        -java.nio.file.NoSuchFileException
    
```

[NullPointerException](http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html):

```

    -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](http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html):

> (適当訳)  
>  実行時例外は、プログラミング上の問題の結果の現れであり、そんなものは、API  
>
> 利用コードが復帰・対処できる事柄ではない。数値例外（ゼロ除算）、nullに対するアクセスによるポインタ例外、配列に対する大きすぎるまたは小さすぎるインデックス値指定などがそれらに該当する.  
>  ...  
>  最低限のラインはこれだろう －
> 「(APIを利用する)クライアントプログラムが例外から復帰できるとされるなら、チェック例外としなさい。プログラムが例外から復帰するために何もできないならば、実行時例外としなさい。」
CC BY-SA 3.0
2015-01-20T00:56:57.570
4868
2015-01-20T02:07:11.820
2015-01-20T02:07:11.820
4978
4978
4867
answer