2014-10-18 54 views
-1

我正在尝试创建一个程序,该程序将转到特定的导演并打印位于其中的文件。线程错误中的Java异常

下面的代码:

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) 

出了什么问题?谢谢

+0

谢谢大家:) – user3550204 2014-10-18 09:52:38

回答

0

Java出现了java.lang.NullPointerException,当时Java想要使用不存在的东西。这可能是路径错误吗?

1

File.listFiles()可能会返回null如果它用于对象不是目录或无法访问。我不知道是否"Home\\Documents"存在,但你应该采取的方法的防御方法:因为在你Srch方法,你检查之前调用listFiles

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()); 
    } 
} 
1

该问题最有发生root是否实际上是一个目录。如该法的规定的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调试最简单的例外之一。只需在您的调试器中放置一个断点,并在堆栈跟踪中指明该行,并检查哪个对象是null。然后你知道为什么你会得到例外,你可以开始修复它。通常,这可以归结为:

  • null是一个有效的情况下,你忘了处理它
  • null不是有效的情况,然后你需要调查该变量如何能成为null并修复它的上游

旁注为下一次你张贴问题:

  • 提供在t适当的缩进他代码发布。你的文字很难读
  • 尝试在粘贴代码时避免复制粘贴错误。前两行是重复的
  • 您发布堆栈跟踪(好),但它甚至会更好,如果您指示出现在堆栈跟踪中的行号对应的行号。请记住,我们没有获得您的代码,以便从堆栈跟踪联行号的代码片断您发表是远离琐碎
0

这里:

File[] list=root.listFiles(); 

ListFile中可能返回的方法“空”。 检查的Javadoc:http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles()

,那么你做这个空变量的foreach,你会得到一个NullPointerException - 如果路径给SRCH方法不表示一个目录。

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路径。

相关问题