首页 > 解决方案 > 为什么程序在打印出第一个 java 文件后会抛出 NullPointerException?

问题描述

我已经实现了以下两种方法,它们是用于打印目录的子目录和 .java 文件的程序的一部分。在打印第一个目录和第一个 java 文件后,它会抛出一个NullPointerException. 我无法弄清楚为什么它不继续打印其余 .java 文件的原因。这两种方法是:

public static void printAllJavaFiles(File directory) {
    if ((directory.isDirectory()) || (directory.isFile() && (directory.getName().endsWith(".java"))){
        print(directory);
        depth++;
        File[] subs = directory.listFiles();
        assert subs != null;
        for (File f : subs)
            printAllJavaFiles(f);
        depth--;
    }
 } 
 private static void print(File directory) {
    StringBuilder strb = new StringBuilder();
    for (int i = 0; i < depth; i++)
        strb.append(" ");
    System.out.println((++count)+strb.toString()+directory.getName()+" "+directory.getUsableSpace());
 } 

 1 src 433863356416
 2  .idea 433863356416
 3  am223xi_assign1 433863356416
 4   Area.java 433863356416
 Exception in thread "main" java.lang.NullPointerException
    at am223xi_assign3.PrintJavaMain.printAllJavaFiles(PrintJavaMain.java:22)
    at am223xi_assign3.PrintJavaMain.printAllJavaFiles(PrintJavaMain.java:23)
    at am223xi_assign3.PrintJavaMain.printAllJavaFiles(PrintJavaMain.java:23)
    at am223xi_assign3.PrintJavaMain.main(PrintJavaMain.java:10)

标签: javarecursionnullpointerexception

解决方案


它抛出空指针异常,因为您使用的是 assert subs != null 但在没有 -ea VM 标志的情况下运行程序,因此该行下方抛出空指针异常

for (File f: subs) as subs are null for file objects

如果你使用“-ea”VM 标志运行程序,你最终会得到如下的 AssertionError。

 1src 276591165440
 2 XXX.java 276591165440
 Exception in thread "main" java.lang.AssertionError

因为在断言 subs != null; 之后程序会终止。因为文件对象会失败。

使用 if 而不是 assert - 它将打印文件夹中的所有文件

public static void printAllJavaFiles(File directory) {
    if ((directory.isDirectory()) || (directory.isFile() && 
   (directory.getName().endsWith(".java")))) {
        print(directory);
        depth++;
        File[] subs = directory.listFiles();
        if(subs != null) {
            for (File f : subs) {
                printAllJavaFiles(f);
            }
        }
        depth--;
    }
}

推荐阅读