我有一个我想要创建的文件,所以我想确保它的所有父目录在创建之前就已存在(或者我会收到错误)。
File fileA = fileB.getParentFile();
现在,如果fileB确实有父文件,fileA将包含一个实际的文件对象。但是,如果fileB没有父级,则fileA将等于null,并且在fileA上调用createNewFile()将导致NullPointerException错误。因此,安全地创建fileA的唯一方法是执行以下操作:
if (fileA != null) {
fileA.mkdirs();
{
fileB.createNewFile();
然而,普遍的共识似乎是你不应该在你的代码中使用!= null检查,因为这是不好的做法。这条规则是否有例外,这是其中之一吗?或者有没有更好的方法来表达这段代码?
答案 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