A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张权 中级黑马   /  2013-1-13 18:16  /  4080 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张权 于 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()方法获取的文件就必须要判断一下,不判断就报空指针异常,如果封装了具体的文件,获取到的文件不用判断也不会报错,为什么?

7 个回复

倒序浏览
这是因为你if的判断条件有问题,如果一个图片文件,isFile为true,但是不是以java为格式,那么就会进入else,此时,把图片当成了目录,就错了。你应该把endsWith放进if里面判断
回复 使用道具 举报
黄锦成 发表于 2013-1-13 18:44
这是因为你if的判断条件有问题,如果一个图片文件,isFile为true,但是不是以java为格式,那么就会进入else ...

不对啊,还是会报空指针异常
回复 使用道具 举报
这个应该是如果当file不为目录时,那个数组就为null,所以遍历数组当然会NullPointerException
回复 使用道具 举报
张权 发表于 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:08

谢谢,明白了!!!
回复 使用道具 举报
张权 中级黑马 2013-1-13 20:46:07
7#
王阳 发表于 2013-1-13 20:03
这个应该是如果当file不为目录时,那个数组就为null,所以遍历数组当然会NullPointerException ...

嗯,对,谢谢了,却是是这样,哎!完全没有理解isFile()方法的调用啊,
如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个 File 对象数组,  之前API也没有注意这一点....之前自己写代码都是用文件夹调用,所以就没有出现null.一直没有发现这个问题.
回复 使用道具 举报
       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());
                        }
                }
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马