黑马程序员技术交流社区
标题: 请教一下一个递归显示文件目录的问题 [打印本页]
作者: 罗凯健 时间: 2013-8-29 10:46
标题: 请教一下一个递归显示文件目录的问题
本帖最后由 杨增坤 于 2013-8-29 20:14 编辑
在毕老师的视频看到的。
private static void showdir(File dir) {
File[] f = dir.listFiles();
for (int x = 0; x < f.length; x++) {
if (f[x].isDirectory())
showdir(f[x]);
else
System.out.println(f[x]);
}
然后主函数调用这个showdir方法,传入一个目录。我自己测试的时候,遍历到最后会引发一个空指针异常,老师视频里没有,怎么回事?
作者: 范龙波 时间: 2013-8-29 10:56
这段程序是没有问题的,
引发了空指针原因 还可能是在你的主体函数体里 ,
你可以查查main()其它语句有没有报空的可能
作者: 月黑风高 时间: 2013-8-29 11:03
遍历到最后引发一个空指针异常 说明前面的遍历正常,也就是其中有一个file[]数组没有获取到元素,数组中没有任何元素,你调用f.length当然引发空指针异常 亲,明白了?
作者: 罗凯健 时间: 2013-8-29 11:12
。。不会吧,main里面就封装了一个文件夹对象和调用了函数
作者: 罗凯健 时间: 2013-8-29 11:13
我又看了一下。。程序还没运行到最后,还有几个文件没能读出来。或者是我文件的问题?
作者: 月黑风高 时间: 2013-8-29 11:18
当然了,其中有一个file数组中的元素为空,就会出现空指针异常,空指针异常为运行时异常,程序就会停止。
file封装时必须确保每一个数组都有元素,先判断一下!
作者: 月黑风高 时间: 2013-8-29 11:22
深度遍历文件夹代码展示:
public class Demo {
public static void main(String[] args) throws IOException {
//封装目录为file对象
File dir=new File("D:\\SogouWP");
showAll(dir);
}
public static void showAll(File file){
//获取该目录下的所有文件及文件夹对象
File[] files=file.listFiles();
//遍历每个对象
for (File f:files) {
//如果是文件夹,继续获取其中的内容
if(f.isDirectory())
showAll(f);
//不是文件夹,打印文件的绝对路径
System.out.println(f.getAbsolutePath());
}
}
}
使用增强for循环,避免调用file.length出现空指针。
作者: -OverFly- 时间: 2013-8-29 11:53
package cn.itcast.bolg;
import java.io.File;
/*
请教一下一个递归显示文件目录的问题
*/
//关于递归,其实就是不断的在调用自己的函数
//传文件路径是最好先判断下是否存在 exists()---判断是否存在
public class Recursion {
public static void main(String[] args) {
File file = new File("E:/html阶段授课"); //存在的路径
File file2 = new File("E:/cc"); //不存在的路径
showdir(file); //正常运行
showdir2(file2); //会抛异常 java.lang.NullPointerException
}
private static void showdir(File dir) {
File[] f = dir.listFiles();
if(dir.exists()) //判断是否存在
System.out.println(f.length+"ddd");;
for (int x = 0; x < f.length; x++) {
if (f[x].isDirectory()) //判断是文件夹
showdir(f[x]); //递归
else
System.out.println(f[x]);
}
}
private static void showdir2(File dir){
File[] f = dir.listFiles();
//if(dir.exists()) //判断文件是否存在
for (int x = 0; x < f.length; x++) { //循环遍历
if (f[x].isDirectory()) //是文件夹
showdir(f[x]); //递归
else
System.out.println(f[x]);
}
}
}
作者: wumuzhong 时间: 2013-8-29 12:13
public static void showdir(File dir) {
File[] f = dir.listFiles();
if(f!=null){
for (int x = 0; x < f.length; x++) {
if (f[x].isDirectory())
showdir(f[x]);
else
System.out.println(f[x]);
}
}
}
先判断f是否为空,在执行就不回有空异常了
作者: 行如止水 时间: 2013-8-29 18:28
你应该先判断一下是否为空,再执行就不会有空异常了;
这个是我写的递归显示文件的代码,你看下,也许有借鉴作用:- import java.io.File;
- public class ListDirectoryDemo {
- public static void main(String[] args) {
- File file = new File("d:"+File.separator);
- list(file);
- }
- public static void list (File file){
- if(file.isDirectory()){
- File lists[] = file.listFiles();
- if(lists != null){
- for(int i = 0; i<lists.length; i++){
- list(lists[i]);
- }
- }
- }
- System.out.println(file);
- }
- }
复制代码
作者: 罗凯健 时间: 2013-8-30 21:11
我发现了一个问题(问题没解决的,昨天没网上= =),就是当showdir()里面传入盘符的时候才会报这个空指针异常,而传入一个文件夹就不会出问题。我就想会不会是隐藏文件的问题,然后我传入一个有隐藏文件的文件夹,结果也没报错。传入盘符根目录就会报异常。。但是可以运行
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |