如何避免与file.getParentFile()进行null比较?

时间:2015-07-26 17:53:01

标签: java file io null

我有一个我想要创建的文件,所以我想确保它的所有父目录在创建之前就已存在(或者我会收到错误)。

File fileA = fileB.getParentFile();

现在,如果fileB确实有父文件,fileA将包含一个实际的文件对象。但是,如果fileB没有父级,则fileA将等于null,并且在fileA上调用createNewFile()将导致NullPointerException错误。因此,安全地创建fileA的唯一方法是执行以下操作:

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

然而,普遍的共识似乎是你不应该在你的代码中使用!= null检查,因为这是不好的做法。这条规则是否有例外,这是其中之一吗?或者有没有更好的方法来表达这段代码?

2 个答案:

答案 0 :(得分:2)

一般来说,如果方法设计暗示在方法调用时所请求的对象可能不存在,那么返回null并没有错(如在你的示例中{ {1}}其中fileB.getParentFile();可以合法地没有父母)。

另外,根据所有java-devs圣经,在某些情况下抛出并正确处理NPE很好 - 约书亚布洛赫的有效Java,第2版 - 第60项:" 如果是调用者在一些禁止空值的参数中传递null,约定表示抛出NullPointerException而不是IllegalArgumentException 。"

避免空值检查的另一个选项是Null Object Pattern用法。如果你能认真帮助它,请不要回复null。例如,对于集合,返回fileB(或任何其他空集合)被认为是一种很好的做法,而不是返回Collections.emptyMap()

有关避免无效练习的更多信息,您可以查看类似this文章的内容。 请随意询问我的解释是否过于含糊。

答案 1 :(得分:-1)

更好的方法是检查exists()是否已存在目录或文件:

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

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

有关更多信息,请参阅api:File