2016-10-15 2 views
2

Это Java 1.8.0_102 программы:Java File.createTempFile() бросает NullPointerException

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, оба аргумента могут быть нулевым. Любая идея, почему это конкретное исключение бросается?

+3

«* В соответствии с Javadocs оба аргумента могут быть пустыми *« можете ли вы привести этот фрагмент документации? Из того, что я вижу [там] (https://docs.oracle.com/javase/8/docs/api/java/io/File.html#createTempFile-java.lang.String-java.lang.String-) " Строка ** prefix **, которая будет использоваться при генерации имени файла, ** должна содержать не менее трех символов ** "(выделено мной) – Pshemo

+0

Yup. См. Мой комментарий ниже принятого ответа. – mbmast

ответ

3

префикс не может быть пустым в соответствии с JavaDoc

Параметры:

префикс - префикс строки, которые будут использоваться при формировании имени файла; должно быть не менее трех символов

suffix - строка суффикса, которая будет использоваться при создании имени файла; может быть пустым, в этом случае суффикс «.tmp» будет использоваться

+1

Я читал Javadocs для 1.8.0_20, а не для 1.8.0_102, и они ** разные **! Я знаю, что не использовать Javadocs для одной версии Java, пока я компилирую другую версию, но у меня никогда не возникало этой проблемы для разных версий * той же * версии. – 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

Ugh. Ты прав. Означает ли SO награждение значков за позор? – mbmast

1

Java-документ говорит: „префикс Строка префикс, который будет использоваться при формировании имени файла, должно быть не менее трех символов“. Именно поэтому он выбрасывает исключение нулевого указателя. Вот ссылка File java doc

0

В соответствии с выводом ошибки исключение представляет собой исключение NullPointerException. Однако, согласно Javadocs для File.createTempFile, это не исключение. Это означает, что с вашим кодом происходит что-то неожиданное. Мы можем видеть source code, чтобы точно увидеть, что происходит (помните о третьем параметре, directory имеет значение null, потому что вы использовали перегруженную версию).

Самое первое, что он делает, это проверить, чтобы увидеть длину prefix и убедиться, что она не менее 3 (строка 2000). Однако, поскольку ваше значение для prefix равно null, проверка length() на нем всегда будет возвращать исключение NullPointerException, потому что вы не можете вызывать какие-либо методы для нулевого объекта. Тот факт, что он даже не смог выбросить InvalidArgumentException, является еще одним доказательством того, что он умер в if-check. Мы также можем видеть как в Javadoc, так и в исходном коде, для которого требуется prefix быть строкой с 3 символами. Интересно, что в Java 6 этот метод сделал, чтобы исключить NullPointerException, если prefix был null.

Смежные вопросы