2015-07-26 2 views
0

У меня есть файл, который я хочу создать, поэтому я хочу, чтобы все его родительские каталоги были установлены до его создания (или я получу ошибку).Как избежать нулевого сравнения с file.getParentFile()?

File fileA = fileB.getParentFile(); 

Теперь, если fileB действительно имеет родительский файл, файлA будет содержать фактический файл-объект. Однако, если fileB не имеет родителя, fileA будет равен нулю, а вызов createNewFile() в файлеA приведет к ошибке NullPointerException. Таким образом, единственный способ создания FiLea безопасно было бы тогда сделать следующее:

if (fileA != null) { 
    fileA.mkdirs(); 
{ 
fileB.createNewFile(); 

Однако, по общему мнению, кажется, что вы никогда не должны использовать = нулевой чек в вашем коде, потому что это плохая практика , Существуют ли исключения из этого правила и является ли это одним из них? Или есть лучший способ, которым я мог бы обозначить этот код?

+1

Попытайтесь таким образом 'File fileA = fileB.getAbsoluteFile(). GetParentFile();' –

+1

Использование '! = Null', безусловно, не всегда плохая практика и полностью прекрасная. Как подтверждает документация java.io.File.getParentFile() ', возвращаемое значение null не указывает на исключительное поведение для этого конкретного метода. –

+0

'Первое правило кодирования - нет фиксированного правила', когда вам нужно использовать'! = Null', как в этой ситуации, вы должны использовать. – Karthik

ответ

-1

Лучший способ это проверить с exists() если direcotry или файл уже существует:

File fileA = new File(fileB.getParentFile()); 

if (!fileA.exists()) { 
    fileA.mkdirs(); 
} else { 
    fileB.createNewFile(); 
} 

См апи для более подробной информации: File

+0

Можно ли передать 'null' в' File' конструктор? – Karthik

+0

выше будет вызывать исключение нулевого указателя! – prakharsingh95

+0

@ prakharsingh95 Нет, не будет. Он даже не компилируется. – Tom

2

Вообще, нет ничего плохого в возвращении null в случае, когда метод дизайн предполагает, что запрашиваемый объект может быть не существующим во время вызова метода (как в вашем примере с fileB.getParentFile();, где fileB юридически не имеет родителя).

Кроме того, в некоторых ситуациях это нормально бросать и правильно обрабатывать NPE в соответствии с любой бивакой java-devs. Эффективная Java, 2nd Edition от Joshua Bloch. Пункт 60: «Если вызывающий абонент пропускает null в каком-либо параметре, для которого null значения запрещены, соглашение диктует исключение NullPointerException, а не IllegalArgumentException. "

Еще один вариант, чтобы избежать нулевых проверок - Null Object Pattern. Не возвращайте нуль, если вы можете помочь, серьезно. Например, в случае коллекций возвращение Collections.emptyMap() (или любая другая пустая коллекция) считается хорошей практикой вместо того, чтобы возвращать null.

Для получения дополнительной информации об избегающей-нулевой практике вы можете проверить что-то вроде this. Не стесняйтесь спрашивать, не слишком ли расплывчато мое объяснение.

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