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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 fei_xiong 于 2014-4-25 19:30 编辑

学了文件之后,我自己做了一个删除空文件夹的程序,但.....报异常了,空指针异常
  1. import java.io.File;

  2. public class Demo {
  3.         public static void main(String[] args) {

  4.                 String dirNameString = "d:\\";

  5.                 File file = new File(dirNameString);

  6.                 deleteNull(file);

  7.         }

  8.         public static void deleteNull(File file) {
  9.                 if (file.listFiles().length == 0)
  10.                         System.out.println(file.getAbsolutePath() + "删除:" + file.delete());
  11.                 else {

  12.                         for (File file2 : file.listFiles()) {
  13.                                 if (file2.isDirectory()) {
  14.                                         deleteNull(file2);
  15.                                         if (file2.listFiles().length == 0) {
  16.                                                 System.out.println(file2.getAbsolutePath() + "删除:"
  17.                                                                 + file2.delete());
  18.                                         }
  19.                                 }
  20.                         }
  21.                 }

  22.         }

  23. }
复制代码

这是异常信息,程序先运行了一段时间,删除了几个空文件之后,才报的异常
  1. Exception in thread "main" java.lang.NullPointerException
  2.         at Demo.deleteNull(Demo.java:15)
  3.         at Demo.deleteNull(Demo.java:23)
  4.         at Demo.main(Demo.java:10)
复制代码

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 悠然丶 于 2014-4-24 22:03 编辑

for (File file2 : file.listFiles()) {
                                if (file2.isDirectory()) {
                                        deleteNull(file2);
                                }else{                          //在这个位置应该加上else.删除文件,应该就可以了,注意这里删除是不走回收站的,要小心点啊!
                                        file2.delete();    //有些文件是不能删除的,系统会有隐藏的文件,你最好拿一个不重要的文件试验,不要拿整个盘来试验,太大了,里面有系统
                                }                                       //文件,可能导致你删除失败
                                        if (file2.listFiles().length == 0) {
                                                System.out.println(file2.getAbsolutePath() + "删除:"
                                                                + file2.delete());
                                        }
                                }
                        }

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
这样的话会把文件中的文件删掉的啊,
if (file2.isDirectory()) {
                                        deleteNull(file2);
                                }else{                          //在这个位置应该加上else.删除文件,应该就可以了,注意这里删除是不走回收站的,要小心点啊!
                                        file2.delete();    //有些文件是不能删除的,系统会有隐藏的文件,你最好拿一个不重要的文件试验,不要拿整个盘来试验,太大了,里面有系统

就是else那一步,不是目录就要删掉,但是我想要的是只删掉空目录啊

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
  1. for (File file2 : file.listFiles()) {
  2.                                 if (file2.isDirectory()) {
  3.                                         deleteNull(file2);
  4.                                         if (file2.listFiles().length == 0) {
  5.                                                 System.out.println(file2.getAbsolutePath() + "删除:"
  6.                                                                 + file2.delete());
  7.                                         }
  8.                                 }
  9.                         }
复制代码

这段代码逻辑有问题。如果file2是个空目录,deleteNull(file2)就会把file2给删除,然后程序继续往下执行if语句,if (file2.listFiles().length == 0) ,file2已经被删除了,那么就会抛出空指针异常。
所以逻辑应该这样写:
  1. for (File file2 : file.listFiles()) {
  2.                                 if (file2.isDirectory()) {
  3.                                         if (file2.listFiles().length == 0) {
  4.                                                 System.out.println(file2.getAbsolutePath() + "删除:"
  5.                                                                 + file2.delete());
  6.                                         }else
  7.                                                  deleteNull(file2);
  8.                                 }
  9.                         }
复制代码

或者直接把  if (file2.listFiles().length == 0) {
                                                System.out.println(file2.getAbsolutePath() + "删除:"
                                                                + file2.delete());
                                        }
这段代码删掉

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
学了一招。
回复 使用道具 举报
我也学习了!!!
回复 使用道具 举报
明白了,
但我试了下还是会暴空指针异常..额,难道删个空文件这么麻烦
回复 使用道具 举报
本帖最后由 fei_xiong 于 2014-4-25 18:46 编辑

按照清风夜独醉的代码,我进行了一次修改
  1. for (File file2 : file.listFiles()) {

  2.                         if (file2.isDirectory()) {
  3.                         
  4.                                 if (file2.listFiles().length != 0) {

  5.                                         show(file2);
  6.                                 }
  7.                                 if (file2.listFiles().length == 0) {

  8.                                         System.out.println(file2.getAbsolutePath() + "删除"
  9.                                                         + file2.delete());
  10.                                 }

  11.                         }
  12.                         System.out.println(file.getAbsolutePath()+"完成!");
  13.                 }
复制代码


并且在for循环外加了一句

System.out.println(file.getAbsolutePath()+"完成!");
要说一下为什么在
  if (file2.listFiles().length != 0)                                     
               show(file2);
之后再加一个
if (file2.listFiles().length == 0) 而不是else
是因为我想要在子文件夹删完之后在判定母文件夹是否为空,这样避免空文件夹中出现空文件夹,删不掉母的空文件夹
最后控制台输出:

d:\RECYCLER完成!
d:\完成!
Exception in thread "main" java.lang.NullPointerException
        at Demo.show(Demo.java:28)
        at Demo.main(Demo.java:12)

因为d盘完了,所以报的空指针异常,虽然仍然不知道为何报的空指针,但是有种莫名的心安的感觉
最后@清风夜独醉  不知道可不可以,试试吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马