线程错误中的Java异常
我正在尝试创建一个程序,该程序将转到特定的控制器并打印位于其中的文件 代码如下:线程错误中的Java异常,java,file,Java,File,我正在尝试创建一个程序,该程序将转到特定的控制器并打印位于其中的文件 代码如下: import java.io.File; public class FileViewer { mport java.io.File; public class FileViewer { public void Srch(String path) { File root=new File(path); File[] list=root.listFiles(); for(File x:list) { if(x
import java.io.File;
public class FileViewer {
mport java.io.File;
public class FileViewer {
public void Srch(String path)
{
File root=new File(path);
File[] list=root.listFiles();
for(File x:list)
{
if(x.isDirectory())
{
Srch(x.getAbsolutePath());
System.out.println(x.getAbsolutePath());
}
else
{
System.out.println(x.getAbsolutePath());
}}}}
public class Viewer {
public static void main(String[] args) {
FileViewer Srch2=new FileViewer();
Srch2.Srch("Home\\Documents");
}
}
我得到了以下错误
Exception in thread "main" java.lang.NullPointerException
at FileViewer.Srch(FileViewer.java:9)
at Viewer.main(Viewer.java:7)
有什么问题吗?谢谢当java想要使用不存在的东西时,会出现java.lang.NullPointerException。可能是路径错误吗?如果在非目录或无法访问的对象上使用,则可能返回
null
。我不确定是否存在“Home\\Documents”
,但您可能应该在方法中采取防御措施:
public void Srch(String path) {
File root=new File(path);
if (root.exist() && root.isDirectory()) {
File[] list=root.listFiles();
for(File x:list) {
Srch(x.getAbsolutePath());
System.out.println(x.getAbsolutePath());
}
} else {
System.out.println(x.getAbsolutePath());
}
}
问题最常见的原因是,在
Srch
方法中,在检查root
是否实际上是目录之前调用了listFiles
。正如该方法的javadoc中所述
如果此抽象路径名不表示目录,则返回null
确保你也能处理好这个案子。比如说
public class FileViewer {
public void Srch(String path){
File root=new File(path);
File[] list=root.listFiles();
if ( list == null ){
return;
}
for(File x:list){
if(x.isDirectory()){
Srch(x.getAbsolutePath());
System.out.println(x.getAbsolutePath());
} else {
System.out.println(x.getAbsolutePath());
}
}
}
}
请注意,NullPointerException
是Java中最容易调试的异常之一。只需将调试器的断点放在stacktrace中指示的行上,并检查哪个对象是null
。然后您就知道了为什么会出现异常,并可以开始修复它。这通常归结为:
是一种有效的情况,您忘记处理它了null
不是一种有效的情况,然后您需要调查该变量如何为null
,并在上游修复它null
- 为您发布的代码提供适当的缩进。你的真的很难读
- 粘贴代码时尽量避免复制粘贴错误。前两行是重复的
- 您发布了stacktrace(很好),但是如果您指出stacktrace中出现的行号对应于哪一行,那就更好了。请记住,我们无法访问您的代码,因此将stacktrace中的行号链接到您发布的代码片段绝非易事
- 此处:
File[] list=root.listFiles();
方法listFile可能返回“null”。
检查Javadoc:
然后对这个空变量执行foreach,如果给Srch方法的路径名不表示目录,则会得到一个NullPointerException
if(list!=null)
{
for(File x:list)
{
if(x.isDirectory())
{
Srch(x.getAbsolutePath());
System.out.println(x.getAbsolutePath());
}
else
{
System.out.println(x.getAbsolutePath());
}
}
}
可能是“主页\文档”不存在,请尝试使用abslotute路径。