Java 在for循环中使用新文件调用时获取NullPointerException
我不太明白出了什么问题。这段代码以前可以工作,但在我移动了一些目录之后(尽管我已经将它们移回了以前的状态),现在代码突然拒绝编译,并将其称为NullPointerException(尽管我正在那里创建一个新对象) 猫是一根绳子。在当前存在的实例中,cat作为“cat1”传递,这是我的项目文件夹中的目录名Java 在for循环中使用新文件调用时获取NullPointerException,java,file,loops,for-loop,nullpointerexception,Java,File,Loops,For Loop,Nullpointerexception,我不太明白出了什么问题。这段代码以前可以工作,但在我移动了一些目录之后(尽管我已经将它们移回了以前的状态),现在代码突然拒绝编译,并将其称为NullPointerException(尽管我正在那里创建一个新对象) 猫是一根绳子。在当前存在的实例中,cat作为“cat1”传递,这是我的项目文件夹中的目录名 for(int i = 1; i <= new File(cat).listFiles().length; i++){ for(int i=1;i上面使用的代码可以在运行时抛出NPE(正
for(int i = 1; i <= new File(cat).listFiles().length; i++){
for(int i=1;i上面使用的代码可以在运行时抛出NPE(正如@shmosel已经提到的),因为listFiles()
可以在其实现中返回空值:
public File[] listFiles() {
String[] ss = list();
if (ss == null) return null;
...
}
它的javadoc也支持同样的功能
因此,如果目录路径(代码中的路径名cat
)中没有任何文件/目录,那么listFiles
调用将返回null
,并且.length
将抛出NullPointerException您忽略了File.listFiles()
返回null。它是有文档记录的
for(int i = 1; i <= new File(cat).listFiles().length; i++){
或者更好地继续使用:
for (File file : files)
// do something with file
代码拒绝编译,称之为NullPointerException-NPE是一个运行时错误,而不是编译器错误。根据listFiles()的javadocs,代码在哪里?堆栈跟踪在哪里
:一个抽象路径名数组,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则该数组将为空。返回“null”如果此抽象路径名不表示目录,或者发生I/O错误。
可能cat
的值不表示目录。这应该是一个好的开始。我只放这行代码,因为从错误消息到这一行代码的所有内容都指向这一行。我将尝试在堆栈跟踪中进行编辑。是吗一个常见的问题是,在for语句的终止条件下不断创建新对象,尽管这不是主要问题?@BenBoudreau为了更清晰,您必须共享异常的stacktrace。好的,这肯定意味着这需要做得更好。我这里的问题的基础是,它在之前和突然之间都工作正常y停止工作,但这本身可能是糟糕的编程实践。@BenBoudreau确实,您可能应该检查您正在使用的目录,然后尝试使用listFiles。谢谢您的提示。使用isDirectory表明它是“false”。需要弄清楚从这里到哪里。@BenBoudreau That表示cat
不是一个目录,或者根本不存在,或者您没有对它的读取权限。解决了我的愚蠢问题(因为它们往往是)。是像我想的那样为cat传递“cat0”,而不是“cat1”,因为我错误地设置了不同的for循环。感谢所有帮助人员。
File[] files = new File(cat).listFiles();
if (files != null)
{
for (int i = 1; i < files.length; i++)
// do something with files[i]
}
for (File file : files)
// do something with file