黑马程序员技术交流社区

标题: 关于io 空指针异常的问题 [打印本页]

作者: 张权    时间: 2013-1-13 18:16
标题: 关于io 空指针异常的问题
本帖最后由 张权 于 2013-1-13 20:47 编辑

public class SearchAndCopy {
        public static void main(String[] args) {
                // 封装目录
                File file = new File("D:\\");//如果我封装时,封装一个具体的文件,不判断也不会报空指针异常
                search(file);
        }

        public static void search(File file) {
                File[] files = file.listFiles();
                if (files != null) {//如果这里不判断,就会报空指针异常,为什么?  
                        for (File f : files) {
                                                                if (f.isFile() && f.getName().endsWith(".java")) {
                                        System.out.println(f);
                                } else {
                                        search(f);
                                }
                        }
                }
        }
总结上面的问题,问题就是如果读取文件时,只封装盘符,那么当调用listFiles()方法获取的文件就必须要判断一下,不判断就报空指针异常,如果封装了具体的文件,获取到的文件不用判断也不会报错,为什么?
作者: 黄锦成    时间: 2013-1-13 18:44
这是因为你if的判断条件有问题,如果一个图片文件,isFile为true,但是不是以java为格式,那么就会进入else,此时,把图片当成了目录,就错了。你应该把endsWith放进if里面判断
作者: 张权    时间: 2013-1-13 19:03
黄锦成 发表于 2013-1-13 18:44
这是因为你if的判断条件有问题,如果一个图片文件,isFile为true,但是不是以java为格式,那么就会进入else ...

不对啊,还是会报空指针异常
作者: 王阳    时间: 2013-1-13 20:03
这个应该是如果当file不为目录时,那个数组就为null,所以遍历数组当然会NullPointerException
作者: 黄锦成    时间: 2013-1-13 20:08
张权 发表于 2013-1-13 19:03
不对啊,还是会报空指针异常
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 // 封装目录
  4.                 File file = new File("E:\\workspace\\day01");// 如果我封装时,封装一个具体的文件,不判断也不会报空指针异常
  5.                 search(file);
  6.         }

  7.         public static void search(File file) {
  8.                 File[] files = file.listFiles();
  9.                 for(File f : files){
  10.                         if(f.isDirectory()){
  11.                                 search(f);
  12.                         }else{
  13.                                 if(f.getName().endsWith(".java")){
  14.                                         System.out.println(f.getName());
  15.                                 }
  16.                         }
  17.                 }
  18.         }

  19. }
复制代码

作者: 张权    时间: 2013-1-13 20:42
黄锦成 发表于 2013-1-13 20:08

谢谢,明白了!!!
作者: 张权    时间: 2013-1-13 20:46
王阳 发表于 2013-1-13 20:03
这个应该是如果当file不为目录时,那个数组就为null,所以遍历数组当然会NullPointerException ...

嗯,对,谢谢了,却是是这样,哎!完全没有理解isFile()方法的调用啊,
如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个 File 对象数组,  之前API也没有注意这一点....之前自己写代码都是用文件夹调用,所以就没有出现null.一直没有发现这个问题.
作者: 铿锵科技    时间: 2013-1-13 23:31
       public static void search(File file) {
                File[] files = file.listFiles();
                if (files != null) {//如果这里不判断,就会报空指针异常,为什么?  
                        for (File f : files) {
                                                                if (f.isFile() && f.getName().endsWith(".java")) {//在java中目录和文件都是File类
                                        System.out.println(f);
                                } else {
                                        search(f);
                                }
                        }
                }
        }

正确代码如下:
        public static void search(File dir) throws IOException
        {
                File[] fs=dir.listFiles();
                for(File f :fs)
                {
                        if(f.isDirectory()){
                                search(f);//是目录递归
                        }
                        else
                        {
                                if(f.getName().endsWith(".java"))
                                        System.out.println(f.getName());
                        }
                }
        }




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