Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java createTempFile()抛出NullPointerException_Java_Nullpointerexception - Fatal编程技术网

Java createTempFile()抛出NullPointerException

Java createTempFile()抛出NullPointerException,java,nullpointerexception,Java,Nullpointerexception,此Java 1.8.0_102程序: import java.io.File; import java.io.IOException; public class Main { public static void main(String[] args) { File tempFile = null; try { tempFile = File.createTempFile(null, null); } cat

此Java 1.8.0_102程序:

import java.io.File;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        File tempFile = null;

        try {
            tempFile = File.createTempFile(null,  null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
引发此异常:

Exception in thread "main" java.lang.NullPointerException
    at java.io.File.createTempFile(Unknown Source)
    at java.io.File.createTempFile(Unknown Source)
    at Main.main(Main.java:10)

根据Javadocs,两个参数都可能为null。知道为什么会抛出此特定异常吗?

根据

参数:

前缀-用于生成文件名的前缀字符串;长度必须至少为三个字符

后缀-用于生成文件名的后缀字符串;可能为空,在这种情况下,将使用后缀“.tmp”


java文档中说“前缀用于生成文件名的前缀字符串;长度必须至少为三个字符”。这正是它抛出空指针异常的原因。下面是链接

根据错误输出,异常为NullPointerException。然而,根据Javadocs for,这不是抛出的异常。这意味着您的代码中发生了意外情况。我们可以看到,以准确地看到发生了什么(请记住第三个参数,
directory
为空,因为您使用了重载版本)


它要做的第一件事就是检查前缀的长度,并确保它不小于3(在第2000行)。但是,由于
prefix
的值是
null
,因此在其上选中
length()。它甚至没有抛出InvalidArgumentException的事实进一步证明它在if检查中死亡。我们还可以在Javadoc和源代码中看到,它要求
前缀
是一个包含3个字符的字符串。有趣的是,在Java6中,如果
前缀
为null,这个方法确实会显式抛出一个NullPointerException。

“根据Javadocs,两个参数都可能为null”您能引用文档片段吗?从我看到的“用于生成文件名的前缀字符串;必须至少有三个字符长”(emphasis mine)是的。请看我在接受答案下面的评论。我读的是针对1.8.0_20的Javadocs,而不是针对1.8.0_102的Javadocs,它们是不同的!我知道在使用不同版本编译时,不能对一个版本的Java使用Javadocs,但我从来没有在同一版本的不同版本中遇到过这个问题。@mbmast Java不会将公共方法的契约从一个版本更改为下一个版本;这将违反面向对象设计的基本原则。我怀疑你把(java.io)和(java.nio.file)搞混了。你说得对。这样会因为羞耻而颁发徽章吗?