黑马程序员技术交流社区
标题:
学了文件之后,我自己做了一个删除空文件夹的程序,但...
[打印本页]
作者:
fei_xiong
时间:
2014-4-24 20:09
标题:
学了文件之后,我自己做了一个删除空文件夹的程序,但...
本帖最后由 fei_xiong 于 2014-4-25 19:30 编辑
学了文件之后,我自己做了一个删除空文件夹的程序,但.....报异常了,空指针异常
import java.io.File;
public class Demo {
public static void main(String[] args) {
String dirNameString = "d:\\";
File file = new File(dirNameString);
deleteNull(file);
}
public static void deleteNull(File file) {
if (file.listFiles().length == 0)
System.out.println(file.getAbsolutePath() + "删除:" + file.delete());
else {
for (File file2 : file.listFiles()) {
if (file2.isDirectory()) {
deleteNull(file2);
if (file2.listFiles().length == 0) {
System.out.println(file2.getAbsolutePath() + "删除:"
+ file2.delete());
}
}
}
}
}
}
复制代码
这是异常信息,程序先运行了一段时间,删除了几个空文件之后,才报的异常
Exception in thread "main" java.lang.NullPointerException
at Demo.deleteNull(Demo.java:15)
at Demo.deleteNull(Demo.java:23)
at Demo.main(Demo.java:10)
复制代码
作者:
悠然丶
时间:
2014-4-24 21:57
本帖最后由 悠然丶 于 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());
}
}
}
作者:
fei_xiong
时间:
2014-4-25 07:32
这样的话会把文件中的文件删掉的啊,
if (file2.isDirectory()) {
deleteNull(file2);
}else{ //在这个位置应该加上else.删除文件,应该就可以了,注意这里删除是不走回收站的,要小心点啊!
file2.delete(); //有些文件是不能删除的,系统会有隐藏的文件,你最好拿一个不重要的文件试验,不要拿整个盘来试验,太大了,里面有系统
就是else那一步,不是目录就要删掉,但是我想要的是只删掉空目录啊
作者:
清风夜独醉
时间:
2014-4-25 11:49
for (File file2 : file.listFiles()) {
if (file2.isDirectory()) {
deleteNull(file2);
if (file2.listFiles().length == 0) {
System.out.println(file2.getAbsolutePath() + "删除:"
+ file2.delete());
}
}
}
复制代码
这段代码逻辑有问题。如果file2是个空目录,deleteNull(file2)就会把file2给删除,然后程序继续往下执行if语句,if (file2.listFiles().length == 0) ,file2已经被删除了,那么就会抛出空指针异常。
所以逻辑应该这样写:
for (File file2 : file.listFiles()) {
if (file2.isDirectory()) {
if (file2.listFiles().length == 0) {
System.out.println(file2.getAbsolutePath() + "删除:"
+ file2.delete());
}else
deleteNull(file2);
}
}
复制代码
或者直接把 if (file2.listFiles().length == 0) {
System.out.println(file2.getAbsolutePath() + "删除:"
+ file2.delete());
}
这段代码删掉
作者:
小周务商
时间:
2014-4-25 12:57
学了一招。
作者:
zzkang0206
时间:
2014-4-25 15:57
我也学习了!!!
作者:
fei_xiong
时间:
2014-4-25 18:13
明白了,
但我试了下还是会暴空指针异常..额,难道删个空文件这么麻烦
作者:
fei_xiong
时间:
2014-4-25 18:42
本帖最后由 fei_xiong 于 2014-4-25 18:46 编辑
按照清风夜独醉的代码,我进行了一次修改
for (File file2 : file.listFiles()) {
if (file2.isDirectory()) {
if (file2.listFiles().length != 0) {
show(file2);
}
if (file2.listFiles().length == 0) {
System.out.println(file2.getAbsolutePath() + "删除"
+ file2.delete());
}
}
System.out.println(file.getAbsolutePath()+"完成!");
}
复制代码
并且在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盘完了,所以报的空指针异常,虽然仍然不知道为何报的空指针,但是有种莫名的心安的感觉
最后@清风夜独醉 不知道可不可以,试试吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2