在foreach循环中是否有任何null检查?

时间:2018-08-09 05:37:08

标签: java java-stream

我需要一个帮助。 在我们的应用程序中,我们正在通过作业从磁盘空间删除一些目录和文件 有时,由于目录数量众多,此工作需要很多时间,而与此同时 第二次触发,并尝试删除一些已经被删除的文件 第一份工作。结果,我们在for (File file : files)行中得到了Null Pointer Exception 因为parent.listFiles()返回null

要解决此问题,我可以添加一个空检查。但是我在想是否可以使用Stream API 因为我认为从性能角度来看,它比其他方法要领先一点(如果我错了,请纠正我)。

所以我的问题是:

  1. 在foreach()方法中是否存在任何null检查(如下所述)? 换句话说,使用安全吗?我检查了那个方法但是我没有 了解很多

  2. 请建议是否有比此更好的方法。

出现问题的代码:

  public void deleteFile(File parent) {

        if (parent.isDirectory()) {
            File[] files = parent.listFiles();
            for (File file : files) {
                deleteFile(file);
            }

        }
        parent.delete();
    }

解决方案:

Files.walk(rootPath)
            .sorted(Comparator.reverseOrder())
            .map(Path::toFile)
            .peek(System.out::println)
            .forEach(java.io.File::delete);

3 个答案:

答案 0 :(得分:0)

forEach是一种方法,如果有数据,即您的案例文件中有数据,该方法将运行,如果没有文件,则控制将脱离forEach。

我们不需要在forEach中检查null。

答案 1 :(得分:0)

没有空检查。 Java中的foreach构造非常适合NullPointerException

File[] files = null;

 for (File file : files) {
    deleteFile(file);
 }

您应该始终检查!!!

 if(files !=null) {
     for (File file : files) {
       deleteFile(file);
    }
 }

请参阅How does the Java 'for each' loop work?

答案 2 :(得分:0)

考虑使用空检查,例如:

Files.walk(rootPath)
        .filter(Objects:notNull)
        .sorted(Comparator.reverseOrder())
        .map(Path::toFile)
        .peek(System.out::println)
        .forEach(java.io.File::delete);

但不确定Files.walk如何产生空对象。