2016-10-15 21 views
2

にこのJava 1.8.0_102プログラムをスロー。なぜこの特定の例外がスローされているのか?ジャワFile.createTempFile()はNullPointerExceptionが

+3

"Javadocsによると、両方の引数がnullになる可能性があります*"ドキュメントの断片を引用できますか?私が見ているもの(https://docs.oracle.com/javase/8/docs/api/java/io/File.html#createTempFile-java.lang.String-java.lang.String-)から " **接頭辞**ファイル名の生成に使用する文字列; **は少なくとも3文字以上の長さでなければなりません** "(emphasis mine) – Pshemo

+0

受け入れられた答えの下に私のコメントを参照してください。 – mbmast

答えて

3

プレフィックスはJavaDoc

パラメータに応じてnullにすることはできません。

プリフィックス - ファイル名を生成するために使用される接頭辞文字列。少なくとも3文字以上である必要があります。

接尾辞 - ファイル名の生成に使用される接尾文字列です。接尾その場合には、nullの場合も、「の.tmp」が

+1

私は1.8.0_20のJavadocを読んでいましたが、1.8.0_102のJavadocは読んでいませんでした。私は別のバージョンを使用してコンパイルしている間にJavaの1つのバージョンに対してJavadocを使用しないことを知っていますが、同じバージョンの異なるリリースでこの問題が発生したことはありません。 – mbmast

+1

@mbmast Javaはパブリックメソッドの契約をあるバージョンから次のバージョンに変更しません。オブジェクト指向設計の基本原則に違反することになります。私はあなたが[File.createTempFile](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#createTempFile-java.lang.String-java.lang.String)を混乱させたと思う - )(java.io内)と[Files.createTempFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.lang.String -java.lang.String-java.nio.file.attribute.FileAttribute ...-)(java.nio.file内)。 – VGR

+0

あなたは正しいです。 SOは恥のためにバッジを授与していますか? – mbmast

1

を使用されるJavaのドキュメントは、 『;少なくとも3つの文字でなければならないファイル名を生成するために使用されるプレフィックス文字列を接頭辞』と言います。なぜそれがnullポインタ例外をスローしているのか。ここにリンクがありますFile java doc

0

エラー出力によると、例外はNullPointerExceptionです。しかし、File.createTempFileのJavadocによると、例外はスローされません。つまり、あなたのコードで予期せぬことが起こっていることを意味します。 source codeを見ると、何が起こっているのかを正確に見ることができます(オーバーロードされたバージョンを使用したため、directoryはnullです)。

最初に行うことは、長さがprefixで、3以上であることを確認することです(2000行目)。ただし、prefixの値がnullであるため、ヌルオブジェクトに対してメソッドを呼び出すことができないため、length()をチェックすると常にNullPointerExceptionが返されます。 InvalidArgumentExceptionをスローすることさえできなかったという事実は、それがif-checkで死んだという証拠です。また、Javadocとソースコードの両方で、prefixが3文字の文字列であることが必要であることもわかります。興味深いことに、Java 6では、このメソッドprefixがnullの場合には、がNullPointerExceptionを明示的にスローしました。