import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Test5 {
/**
 * 取出E:盘下全部的.java文件的文件路径保存在java.txt文件中
 */
public static void main(String[] args) throws IOException {
File f = new File("E:\\"); //这里面换成E:盘下一个子文件夹就没有问题
BufferedWriter bfw = new BufferedWriter(new FileWriter("java.txt"));
javaList(f, bfw);
bfw.close();
}
public static void javaList(File f, BufferedWriter bfw) throws IOException {
if (f.exists()) {
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
javaList(files[i], bfw);
} else {
if (files[i].getName().endsWith(".java")) {
bfw.write(files[i].getAbsolutePath());
bfw.newLine();
bfw.flush();
}
}
}
} else {
System.out.println(f.getName() + "不存在");
}
}
}异常信息:
Exception in thread "main" java.lang.NullPointerException
at Test5.javaList(Test5.java:18)
at Test5.javaList(Test5.java:20)
at Test5.main(Test5.java:12)

解决方案 »

  1.   

    File[] files = f.listFiles();
    if (files != null)
      

  2.   

    改装后的。。package com.xiaoyong;import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;public class Test { /**
     * 取出E:盘下全部的.java文件的文件路径保存在java.txt文件中
     */
    public static void main(String[] args) throws IOException {
    File f = new File("E:\\"); // 这里面换成E:盘下一个子文件夹就没有问题
    BufferedWriter bfw = new BufferedWriter(new FileWriter("java.txt"));
    javaList(f, bfw);
    bfw.close();
    } public static void javaList(File f, BufferedWriter bfw) throws IOException {
    if (f.isFile()) {
    if (f.getName().equals(".java")) {
    bfw.write(f.getAbsolutePath());
    bfw.newLine();
    bfw.flush();
    }
    } else {
    File[] files = f.listFiles();
    if (files != null) {
    System.out.println(files == null);
    for (int i = 0; i < files.length; i++) {
    javaList(files[i], bfw);
    }
    }
    }
    }
    }
      

  3.   

    这是在你的代码的基础上改的.
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    public class Test5 {
        /**
         * 取出E:盘下全部的.java文件的文件路径保存在java.txt文件中
         */
        public static void main(String[] args) throws IOException {
            File f = new File("E:\\"); //这里面换成E:盘下一个子文件夹就没有问题
            BufferedWriter bfw = new BufferedWriter(new FileWriter("java.txt"));
            javaList(f, bfw);
            bfw.close();
        }
        public static void javaList(File f, BufferedWriter bfw) throws IOException {
            if (f.exists()) {
                File[] files = f.listFiles();
                if (files != null && files.length > 0) {
                for (int i = 0; i < files.length; i++) {
                    if (files[i].isDirectory()) {
                        javaList(files[i], bfw);
                    } else {
                        if (files[i].getName().endsWith(".java")) {
                            bfw.write(files[i].getAbsolutePath());
                            bfw.newLine();
                            bfw.flush();
                        }
                    }
                }
                }
            } else {
                System.out.println(f.getName() + "不存在");
            }
        }
    }
      

  4.   

    应该先判断文件是不是目录,不是目录就写入文件名,是目录,就递归调用javaList
      

  5.   

    E盘下没有空目录,我放一个空文件夹在E:\Workspace中一样可以运行通过
      

  6.   


    因为在根目录下有一个特殊的目录,E:\System Volume Information
    用下面的程序就明白了.那个目录是取不到listFiles()的import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    public class Test5 {
        /**
         * 取出E:盘下全部的.java文件的文件路径保存在java.txt文件中
         */
        public static void main(String[] args) throws IOException {
            File f = new File("E:\\"); //这里面换成E:盘下一个子文件夹就没有问题
            BufferedWriter bfw = new BufferedWriter(new FileWriter("java.txt"));
            javaList(f, bfw);
            bfw.close();
        }
        public static void javaList(File f, BufferedWriter bfw) throws IOException {
            if (f.exists()) {
                File[] files = f.listFiles();
                if (files != null) {
                for (int i = 0; i < files.length; i++) {
                    if (files[i].isDirectory()) {
                        javaList(files[i], bfw);
                    } else {
                        if (files[i].getName().endsWith(".java")) {
                            bfw.write(files[i].getAbsolutePath());
                            bfw.newLine();
                            bfw.flush();
                        }
                    }
                }
                } else {
                 System.out.println("-------------");
                 System.out.println(f);
                 System.out.println("--------------");
                }
            } else {
                System.out.println(f.getName() + "不存在");
            }
        }
    }
      

  7.   

    看源代码分析不会是空文件夹造成的,f.listFiles()会返回一个长度为0的数组。
    应该是该磁盘下的隐藏文件造成的!
      

  8.   

    看来是这个原因了 但是能解释下E:\System Volume Information这是个什么目录么?我隐藏文件全部显示发现没有这个目录?
      

  9.   

    就是这个原因,具体表现为f为文件夹的时候,listFiles包含了隐藏文件夹,但是隐藏文件夹的File对象listFiles的时候,会跑出空指针。
      

  10.   

    好像是一些os的风格带的包括什么声音之类的文件夹,不是特清楚,百度下吧,普遍有这个文件。
    看一个盘有没有隐藏文件很容易,到目录下按CTRL+A,若有隐藏文件会有提示。
      

  11.   


    你在命令行模式,用 dir /a能发现它.
    具体的解释看这个.
    http://baike.baidu.com/view/682081.htm?fr=ala0_1_1
      

  12.   

    The array will be empty if the directory is empty.我在源码中只找到这一句,没发现有说如果文件夹为空listFiles就返回长度为0的数组啊,能发出来看一下么?谢谢
      

  13.   

    看到那个文件夹了,呵呵,但是为什么就他返回为null,空文件夹返回的就是长度为0的数组呢?难道是隐藏文件的原因,但是我新建一个空文件夹将其设置为隐藏的返回的依然是长度为0的数组,懵了....