如何解决在基于客户端-服务器的程序中使用递归函数时发生NullPointerException-Java
该程序的目标是从客户端指定的文件夹中打印所有目录,子目录和文件。该程序可以执行此操作,但最终它会引发NullPointerException。我使用递归函数打印子目录。
错误是
线程“主”中的异常java.lang.NullPointerException 在Client.main(Client.java:114)
这是处理列表的客户端程序
try{
File maindir = new File(folder);
if(maindir.exists() && maindir.isDirectory())
{
// array for files and sub-directories
// of directory pointed by maindir
File arr[] = maindir.listFiles();
System.out.println("Files from main directory : " + maindir);
// Calling recursive method
RecursivePrint(arr,0);
}
}
catch (NullPointerException e) {
System.out.println("NPE caught");
}
这是递归打印
static void RecursivePrint(File[] arr,int level)
{
// for-each loop for main directory files
for (File f : arr)
{
// tabs for internal levels
for (int i = 0; i < level; i++)
System.out.print("\t");
if(f.isFile())
System.out.println(f.getName());
else if(f.isDirectory())
{
System.out.println("[" + f.getName() + "]");
// recursion for sub-directories
RecursivePrint(f.listFiles(),level + 1);
}
}
}
有人可以帮我弄清楚为什么会出现NullPointerException以及如何解决它吗?
解决方法
方法listFiles()作为docs中的状态“如果此抽象路径名不表示目录或发生I / O错误,则返回null。”因此,当您尝试打印当前用户无法访问的文件夹时(例如Windows上的“系统卷信息”),您将获得一个由null插入的数组,因此将捕获catch子句。为防止这种情况,您可以简单地在内部递归调用之前进行检查:
// recursion for sub-directories
File[] listFiles = f.listFiles();
if (listFiles != null) {
RecursivePrint(listFiles,level + 1);
}
这将使您可以跳过未访问的文件夹并继续打印。
处理此类问题的另一种方法是在内部递归调用周围添加try-catch块,如下所示:
// recursion for sub-directories
File[] arr1 = f.listFiles();
try {
RecursivePrint(arr1,level + 1);
} catch (NullPointerException e) {
// do something
}
,
您的代码对我来说运行正常,但是您的问题很可能来自该行中的View.generateViewId()
方法调用:
f.listFiles()
查看其读取的该方法的Java文档:
返回:一组抽象路径名,表示该抽象路径名表示的目录中的文件和目录。如果目录为空,则数组为空。 如果此抽象路径名不表示目录或发生I / O错误,则返回null 。
因此,似乎RecursivePrint(f.listFiles(),level + 1);
有时可能返回null。当您尝试在其上调用任何方法时,将导致f.listFiles()
。
为防止这种情况,您可以像下面这样放置一个简单的null检查:
NullPointerException
所以您的File[] files = f.listFiles();
if (files != null) {
RecursivePrint(files,level + 1);
}
方法现在看起来像:
RecursivePrint
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。