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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗宵 中级黑马   /  2012-7-26 23:04  /  1745 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        public static void main(String[] args) {
        File dir=new File("d:\\");
        ArrayList <File>al1=new ArrayList<File>();
        ArrayList<File> al=new ArrayList<File>();
        al=getTxt(dir,al1);
        Iterator<File> it=al.iterator();
        if(it.hasNext()){
                File file=it.next();
                System.out.println(file.getName());
        }
        }
        public static ArrayList<File> getTxt(File dir,ArrayList<File> al){
                File[] files=dir.listFiles();
                for(File file:files){
                        if(file.isDirectory()){
                                getTxt(file,al);
                        }
                        else{
                                if(file.getName().endsWith(".txt"))
                                al.add(file);
                        }
                }
                return al;
        }
}

为什么会抛出Exception in thread "main" java.lang.NullPointerException
        at com.itheima.Test8.getTxt(Test8.java:25)
        at com.itheima.Test8.getTxt(Test8.java:27)
        at com.itheima.Test8.getTxt(Test8.java:27)
        at com.itheima.Test8.main(Test8.java:16)

3 个回复

正序浏览
*我对楼主的代码进行了改进,注释都加的很清楚,对指定目录遍历用到的是递归算法

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Test1 {
        public static void main(String[] args) {
                //要遍历的目录
                File dir = new File("src");
               
                //遍历指定目录后得到的File对象放在次List集合中
                List<File> txtFiles = new ArrayList<File>();
               
                //到指定目录下面去查找txt文件
                getTxtFiles(dir, txtFiles);
               
                //对结果进行遍历
                for (File file : txtFiles) {
                        System.out.println(file.getName());
                }
        }

        //在指定目录下查找所有的txt文件
        public static void getTxtFiles(File file, List<File> txtFiels) {
                //如果是目录
                if (file.isDirectory()) {
                        File[] files = file.listFiles();
                        for (File f : files) {
                                getTxtFiles(f, txtFiels);
                        }
                } else {//如果是文件
                        if (file.getName().endsWith(".txt"))
                                txtFiels.add(file);
                }
        }
}


回复 使用道具 举报
本帖最后由 淡然 于 2012-7-26 23:38 编辑

d:\System Volume Information
Exception in thread "main" java.lang.NullPointerException
        at hcy.test.main.Test.getTxt(Test.java:89)
        at hcy.test.main.Test.getTxt(Test.java:92)
        at hcy.test.main.Test.main(Test.java:56)

System Volume Information是windows系统文件夹,中文名称可以翻译为“系统卷标信息”。这个文件夹里就存储着系统还原的备份信息。
System Volume Information这个文件夹是不能访问的,它的dir.listFiles()返回值为null
从硬盘根目录遍历文件时要特别小心这个文件夹,可在遍历前判断listFiles()返回值是否为null
         public static ArrayList<File> getTxt(File dir,ArrayList<File> al){
         File[] files=dir.listFiles();
       if(files!=null){
         for(File file:files){
                // System.out.println(file);
                 if(file.isDirectory()){
                         getTxt(file,al);
                 }
                 else{
                         if(file.getName().endsWith(".txt")){
                                 al.add(file);
                                // System.out.println(al+" *** "+file);
                         }
                 }
         }
         }
         return al;
}
回复 使用道具 举报
import java.io.*;
import java.util.*;

public class find {
          public static void main(String[] args){
                File dir=new File("g:\\");
                ArrayList <File>al1=new ArrayList<File>();
                ArrayList<File> al=new ArrayList<File>();
                al=getTxt(dir,al1);
                Iterator<File> it=al.iterator();
                while(true){//给你加了一个while循环这样可以全部输出
                if(it.hasNext()){
                        File file=it.next();
                        System.out.println(file.getName());
                }else break;
                
                }
                }
                public static ArrayList<File> getTxt(File dir,ArrayList<File> al){
                        File[] files=dir.listFiles();
                        for(File file:files){
                                if(file.isDirectory()){
                                        getTxt(file,al);
                                }
                                else{
                                        if(file.getName().endsWith(".txt"))
                                        al.add(file);
                                }
                        }
                        return al;
                }
        }
但是我没有出现你数的错误
因为我换了个盘符
而且把d:\\范围减少,指定一个文件夹
就能正确运行
搞不懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马