黑马程序员技术交流社区

标题: 获取文件列表时候为什么会出现空指针异常? [打印本页]

作者: gentleman    时间: 2014-5-4 15:48
标题: 获取文件列表时候为什么会出现空指针异常?
本帖最后由 czwanglei 于 2014-5-5 14:27 编辑

打印了一部分列表后报空指针异常,用递归,出错也应该是内存溢出才对啊?。
  1. import java.io.*;
  2. class FileDemo
  3. {

  4.         public static void main(String[] args)
  5.         {
  6.                 File f= new File("d:\\");
  7.                 showDir(f);

  8.         }
  9.         public static void showDir(File f)
  10.         {
  11.                 File[] arrf=f.listFiles();
  12.                 for(int x=0;x<arrf.length;x++)
  13.                 {
  14.                         if (arrf[x].isDirectory())
  15.                         {
  16.                                 showDir(arrf[x]);
  17.                         }
  18.                         else
  19.                         {
  20.                                 System.out.println(arrf[x].toString());
  21.                         }
  22.                 }
  23.         }
  24. }
复制代码

作者: gentleman    时间: 2014-5-4 15:54
.打印了好多文件列表后挂了,
.
.
.
d:\KuGou\Temp\aec6d0d826cedbf8263c8dfde47191b8.kgtemp
d:\KuGou\Temp\bc66f307d693013761141d893c1ea069.kgtemp
d:\KuGou\Temp\c92e9b244648063c3acd9e7836ce1085.kgtemp
d:\KuGou\Temp\d8685559b4e5e3d127d31c602ecd0fa2.kgtemp
d:\KuGou\Temp\da39f7305b4a989589233943ad5e4959.kgtemp
d:\KuGou\Temp\e013aa6c7e9732a80bb9cba05ae51b97.kgtemp
d:\KuGou\Temp\e24b327e8632a0e9cd368e5fbe0385f4.kgtemp
d:\KuGou\Temp\e9bd08eb47e75dfc5a25b52c3b6ce48a.kgtemp
d:\KuGou\Temp\fd2e1beeef8c2d4328d423bf6ccf8ef8.kgtemp
Exception in thread "main" java.lang.NullPointerException
        at FileDemo.showDir(File1.java:14)
        at FileDemo.showDir(File1.java:18)
        at FileDemo.main(File1.java:8)

E:\>


作者: NewDemo    时间: 2014-5-4 15:54
楼主的代码在我机子上运行没有出现问题,还是请截图下你的异常吧
作者: gentleman    时间: 2014-5-4 15:57
NewDemo 发表于 2014-5-4 15:54
楼主的代码在我机子上运行没有出现问题,还是请截图下你的异常吧

打印的少,确实没有问题,但是打印的多,。比如整个d盘就出现空指针异常,应该是内存溢出才对吧?为什么会是空指针尼?
作者: gentleman    时间: 2014-5-4 16:19
就是这个样子,

捕获.PNG (22.41 KB, 下载次数: 120)

捕获.PNG

作者: gentleman    时间: 2014-5-4 16:43
大家帮忙看看怎么回事?
作者: NewDemo    时间: 2014-5-4 16:46
本帖最后由 NewDemo 于 2014-5-4 16:47 编辑
gentleman 发表于 2014-5-4 16:19
就是这个样子,

调试了下,确实有空指针异常
应该是判断了是目录但没有权限访问,那你调用f.list()就是null,下面你又去arrf.lengrh肯定就抛空指针异常了在for循环外面做个判断if (arrf!=null),这样就可以解决问题了


  1. package day2;

  2. import java.io.File;

  3. public class Test4 {

  4.         public static void main(String[] args) {
  5.                 File f = new File("c:\\");
  6.                 showDir(f);
  7.         }

  8.         public static void showDir(File f) {
  9.                 File[] arrf = f.listFiles();
  10.                 if (arrf!=null)
  11.                         for (int x = 0; x < arrf.length; x++) {
  12.                                 if (arrf[x].isDirectory()) {
  13.                                         showDir(arrf[x]);
  14.                                 } else {
  15.                                         System.out.println(arrf[x].toString());
  16.                                 }
  17.                         }
  18.         }
  19. }
复制代码





作者: z1342802487    时间: 2014-5-4 16:58
本帖最后由 z1342802487 于 2014-5-4 17:11 编辑

空指针原因:
  1、因为遍历到C盘下的“System Volume Information”目录时,这是每个分区下都有的系统目录,用户没有访问权限调用listFiles方法会返回null。 2只要碰见空文件夹listFiles方法就返回null,所以会报空指针异常。
解决办法是if (arrf!=null)就行了。
下面是JDK文档中关于listFiles方法:
抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。
  1. import java.io.*;
  2. public class FileDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 File f= new File("c:\\");
  7.                 showDir(f);
  8.         }
  9.         public static void showDir(File f)
  10.         {
  11.                 File[] arrf=f.listFiles();
  12.                 if (arrf!=null)
  13.                                         {
  14.                                                 for(int x=0;x<arrf.length;x++)
  15.                                         {
  16.                                                 if (arrf[x].isDirectory())
  17.                                                 {
  18.                                                         showDir(arrf[x]);
  19.                                                 }
  20.                                                 else
  21.                                                 {
  22.                                                         System.out.println(arrf[x].toString());
  23.                                                 }
  24.                                         }
  25.                                         }  
  26.         }
  27. }
复制代码


作者: gentleman    时间: 2014-5-4 17:40
NewDemo 发表于 2014-5-4 16:46
调试了下,确实有空指针异常
应该是判断了是目录但没有权限访问,那你调用f.list()就是null,下面你又去arr ...

非常感谢!
作者: gentleman    时间: 2014-5-4 18:20
z1342802487 发表于 2014-5-4 16:58
空指针原因:
  1、因为遍历到C盘下的“System Volume Information”目录时,这是每个分区下都有的系统目录 ...

非常感谢,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2