FileクラスでNullPointerException

JavaAPIは、基本的にIO関係でエラーが発生した場合、例外を投げるような設計になっています。
たとえば、FileInputStream はコンストラクタに存在しないファイルを指定した場合、FileNotFoundException を投げてきます。
また、各メソッドも何かあれば IOException を投げてきます。
逆にいえば、例外を投げないで戻り値を返したということは正常に処理ができた、というようになっています。


でも、Fileクラスだけ違う…。

    public void ls(File dir){
    	for(String str : dir.list()){
    		System.out.println(str);
    	}
    }

もし、引数に渡した dir が存在していないディレクトリを示していた場合、このメソッドは NullPointerException で落ちます
(list メソッドが例外を投げてきません)


実際に動かして、ぬるぽが飛んできて、JavaDoc読んで初めて気付きましたが、Fileクラスはなぜか戻り値チェックしないといけない設計になっています。
この list メソッドも、成功したかどうかを null チェックして確認する必要があります。

この抽象パス名が示すディレクトリにあるファイルおよびディレクトリを示す文字列の配列。配列は、ディレクトリが空の場合は空になる。この抽象パス名がディレクトリを示さない場合、または入出力エラーが発生した場合は null

Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

ディレクトリが存在するのを isDirectory() で事前チェックしていないのが悪い(呼び元が悪い)のだから、こういうのは例外を投げるべきだと思うんですが・・・*1

*1:このような設計になっている可能性として、チェックコストが高いから事前チェックしなくて済むようにしたというのが考えられます。たとえそうだとしても、デメリットが大きいような・・・