我查看了this和this以获取有关NullPointerException的信息,尤其是对于数组。上面的链接说NullPointerExceptions的一个共同点是该对象尚未实例化。我检查了我的代码,以防我没有实例化一个数组,但我似乎无法找到问题。我已经在这段代码上坚持了很长一段时间。
我正在尝试创建一个使用递归来输出程序中所有文件的程序。
import java.io.*;
import javax.swing.*;
public class Driver12
{
public static void main(String[] args) throws Exception
{
String folder = JOptionPane.showInputDialog("Complete path of folder:");
String filename = "";
for(int k = 0; k < folder.length(); k++)
{
char ch = folder.charAt(k);
if(Character.isLetterOrDigit(ch))
filename = filename + ch;
else
filename = filename + '_';
}
System.setOut(new PrintStream(new FileOutputStream(filename + ".txt")));
search(new File(folder));
System.exit(0);
}
public static void search(File f)
{
if(f.isDirectory()) {
File[] array = f.listFiles();
for(int i = 0; i < array.length; i++) {
search(array[i]);
}
}
else {
System.out.println(f.getPath());
}
}
}
当我运行程序并输入时,比如C:\ Windows(因为我在Windows计算机上),程序终止并说:
Exception in thread "main" java.lang.NullPointerException
at Driver12.search(Driver12.java:27)
at Driver12.search(Driver12.java:28)
at Driver12.search(Driver12.java:28)
at Driver12.main(Driver12.java:19)
这里发生了什么?我该如何解决这个错误?
非常感谢任何帮助。
答案 0 :(得分:0)
您正在使用f.listFiles,当目录中没有文件时,它返回null。
这会使您的程序崩溃,因为它不受空保护。
注意:要调试它,您可以使用&#34; Exception断点&#34; Eclipse的功能。在调试透视图中,只需选择断点选项卡,然后单击&#34; J!&#34;图标并添加您想要捕获的异常。
答案 1 :(得分:0)
listFiles可以返回null。所以最好对此进行检查。获得异常的原因是由于在值为null时获取数组的长度。
更新已接受答案的评论:
与接受的答案相反,为没有文件的目录返回一个空数组。我用java 1.8测试了Windows。返回null更有效的原因也是不正确的,因为静态空数组的返回成本相同。
我会检查值为null并在这种情况下输出文件详细信息。也许你有一个有权限问题的联结或特殊目录。
https://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles()
“返回:
一组抽象路径名,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。“