黑马程序员技术交流社区

标题: 为什么输入一个盘符就会抛NullPointerException呀! [打印本页]

作者: 无道    时间: 2014-3-13 17:46
标题: 为什么输入一个盘符就会抛NullPointerException呀!
本帖最后由 无道 于 2014-3-13 21:50 编辑
  1. //使用递归列出一个路径下的文件
  2. package file;
  3. import java.io.*;

  4. public class ListPathFileName{
  5.          
  6.          public static void main(String[] args){
  7.                         
  8.                          System.out.println("输入一个指定的路径:");
  9.                         
  10.                          showDir(new File(inputPath()));
  11.                         
  12.          }
  13.          //键盘录入一个路径
  14.          public static String inputPath(){
  15.                  
  16.                  BufferedReader bufr = null;
  17.                  try{
  18.                         
  19.                          bufr = new BufferedReader(new InputStreamReader(System.in));
  20.                         
  21.                          return bufr.readLine();        
  22.                  }
  23.                  catch(IOException e)        {
  24.                         
  25.                          throw new RuntimeException ("读出路径出问题了!")        ;
  26.                  }
  27.          }        
  28.          
  29.          public static void showDir(File file){
  30.                  
  31.                  System.out.println(file);
  32.                  File[] files = file.listFiles();
  33.          //System.out.println(files.length);
  34.                  
  35.                  for(int x=0; x<files.length; x++)        {
  36.                         
  37.                          if(files[x].isDirectory())        
  38.                                  showDir(files[x]);
  39.                          else
  40.                                  System.out.println(files[x]);
  41.                  }
  42.          }
  43. }
复制代码
为什么当你输入一个盘符时,它就会抛异常,如果输入一个路径时就可以正常运行,  请高人解答。

QQ截图20140313191753.jpg (90.1 KB, 下载次数: 22)

QQ截图20140313191753.jpg

作者: 依旧    时间: 2014-3-13 19:05
测试了一下没有问题,是不是你输入的盘符格式错误,不存在,输入盘符应该这样输入 d:\\    希望能帮到你
作者: 刘望望    时间: 2014-3-13 19:12
精测试输入盘符和输入路径都没问题。不知你输入盘符时是什么格式?一下几种方式均能正确运行:e:、e:/、e:\,但如果只输入e则找不到
作者: 无道    时间: 2014-3-13 19:19
依旧 发表于 2014-3-13 19:05
测试了一下没有问题,是不是你输入的盘符格式错误,不存在,输入盘符应该这样输入 d:\\    希望能帮到你 ...

还是不行呀,是不是我的电脑的问题呀, 刚刚上传一个图片。
作者: 无道    时间: 2014-3-13 19:21
刘望望 发表于 2014-3-13 19:12
精测试输入盘符和输入路径都没问题。不知你输入盘符时是什么格式?一下几种方式均能正确运行:e:、e:/、e:\ ...

是不是电脑的问题呀!刚刚上传了一个图片,还是会抛出一个异常
作者: 刘望望    时间: 2014-3-13 20:29
我不觉得是电脑问题,看运行结果可以确定刚开始运行是正确的,如果行号对应准确的话,很明显是36行的files为null,也就是33行file.listFiles();这个方法返回了null值。下面是我截取的该方法返回值的说明
Returns:
An array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname. The array will be empty if the directory is empty. Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs.
首先可以确定该file指向的是一个目录,也就是说在程序读取到某个目录的时候出现了i/o异常,有可能是该目录访问安全性问题,你可以尝试换个盘符试试
作者: 无道    时间: 2014-3-13 21:07
刘望望 发表于 2014-3-13 20:29
我不觉得是电脑问题,看运行结果可以确定刚开始运行是正确的,如果行号对应准确的话,很明显是36行的files ...

嗯,,,谢了兄弟!
作者: kevinmesss.tz    时间: 2014-3-13 21:59
测试了一下d:,e:,f:都是遍历到System Volume Information这个文件夹的时候出现空指针异常,这是windows系统隐藏的文件夹,(查看文件选项显示隐藏文件夹也不会显示的),java无法访问吧。c:里也一样都有系统隐藏的文件夹java无法访问
作者: 水蓝    时间: 2014-3-13 22:16
本帖最后由 水蓝 于 2014-3-13 22:17 编辑

这个刚刚在操作系统中试了一下。
1、在“文件夹中选项中”,选择去掉“隐藏受保护的系统文件”选项和 勾选 “显示隐藏文件”
可以发现D:\RECYCLE\目录下,的确有这样一个文件夹,但是,你想要进入文件夹,就没有权限了。如下图:



2、所以,作为JAVA程序,也就没有这个权限访问该文件夹了。
在获取该文件夹时,获取其子目录,返回的是null。

3、如果没有强烈要求遍历隐藏目录的话,showDir()方法应该作如下修改:也就是说在if判断条件中,增加一个!files[x].isHidden()的条件,即不去遍历隐藏文件即可。
  1. public static void showDir(File file){
  2.                  
  3.                  System.out.println(file);
  4.                  File[] files = file.listFiles();
  5.          //System.out.println(files.length);
  6.                  
  7.                  for(int x=0; x<files.length; x++)        {
  8.                         
  9.                          if(files[x].isDirectory() && !files[x].isHidden())  //在这边增加一个!files[x].isHidden()的条件
  10.                                  showDir(files[x]);
  11.                          else
  12.                                  System.out.println(files[x]);
  13.                  }
  14.          }
复制代码









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