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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 董将 中级黑马   /  2012-12-21 00:17  /  1964 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 董将 于 2012-12-22 19:44 编辑

递归"f:\\"根目录所有的.java文件,报空指针异常。
  
  public void printAllJava(File dir)
  {
        if(dir!=null)
        {
                File[] files = dir.listFiles();

                for(File file : files)
                {
                        if(file.isFile())
                        {
                                if(file.getName().endsWith(".java"))
                                {
                                        System.out.println(file.getName());
                                }
                        }
                        else
                        {
                                printAllJava(file);
                        }
                }
        }
               
  }
那里的错误呢

4 个回复

倒序浏览
空指针大概有两种可能性都是dir.listFiles()返回的是空,即files是null。
(1)你传的值是个文件的话,明显就不行,files就是null。
(2)第二种情况很特殊,你传的是个盘符,如“f:”(注意不是“f:\\”),得到的files不是null,但是里面的东西全部不是文件,递归调用时dir.listFile就为null。
File.listFiles()得到的数组居然有可能含有非文件的对象的!
回复 使用道具 举报
  1. public static void printAllJava(File dir){
  2.         if(dir!=null)
  3.         {
  4.                 File[] files = dir.listFiles();

  5.                 for(File file : files)
  6.                 {
  7.                         if(file.isFile())
  8.                         {
  9.                                 if(file.getName().endsWith(".java"))
  10.                                 {
  11.                                         System.out.println(file.getName().toString());
  12.                                 }
  13.                         }
  14.                         else if(file.exists() && file.isDirectory())//[color=Red]要么是文件,要么是目录[/color]
  15.                         {
  16.                                 printAllJava(file);
  17.                         }
  18.                 }
  19.         }
  20.           }
复制代码
我改了下你的代码,不过还是感觉优化的不够,而且是在for循环里面递归调用效率应该很低,:
修改过的方法:
  1.           public static void printAllJava1(File dir)
  2.           {
  3.                   if(dir.exists() && dir.isDirectory()){//判断存在而且是目录,就把文件出来
  4.                           File[] files = dir.listFiles();
  5.                             for (File file : files) {
  6.                                 printAllJava1(file);//重复调用
  7.                         }
  8.                   }
  9.                   else {//[color=Red]否则就打印出所需的文件名字[/color]
  10.                           if(dir.getName().endsWith(".java"))
  11.                                           System.out.println(dir.getName());
  12.                   }
  13.           }
复制代码
希望有好人来给出更优化的方案{:soso_e100:}
回复 使用道具 举报
估计你传的是个文件,这个程序没有问题
import java.io.File;


public class aaa {

        public static void main(String[] args) {
                File file=new File("E:\\javap\\File\\src");
                printAllJava(file);
                }

        public static void printAllJava(File dir)
          {
                if(dir.isDirectory())// 测试此抽象路径名表示的文件是否是一个目录。
                {
                        File[] files = dir.listFiles();

                        for(File file : files)
                        {
                                if(file.isFile())
                                {
                                        if(file.getName().endsWith(".java"))
                                        {
                                                System.out.println(file.getName());
                                        }
                                }
                                else
                                {
                                        printAllJava(file);
                                }
                        }
                }
                        
          }


}
回复 使用道具 举报
多谢指点,问题已经解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马