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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 date1130 于 2014-12-4 10:16 编辑
  1. import java.io.File;

  2. public class IODemo {

  3.         public static void main(String[] args) {
  4.                
  5.                 File file = new File("d:\\") ;
  6.                
  7.                 function(file) ;
  8.         }
  9.         
  10.         public static void function(File file){
  11.                
  12.                 File [] arr = file.listFiles();
  13.                
  14.                 for (File f : arr) {
  15.                         
  16.                         if (f.isDirectory()) {
  17.                                 
  18.                                 function(f) ;
  19.                                 
  20.                         } else {
  21.                                 
  22.                                 if (f.getName().endsWith(".class")) {
  23.                                        
  24.                                         System.out.println(f);
  25.                                 }
  26.                         }
  27.                 }
  28.         }
  29. }
复制代码
用递归遍历目录下的。class文件,走到最后的时候,直接报出空指针异常,不只一次遇到了,有时候重新写一遍,但是明明还是这样写,就没事了。望大神指点,技术分送上。这个代码是会出空指针异常的代码。

评分

参与人数 2技术分 +1 黑马币 +4 收起 理由
masai158 + 4 看你骨骼精气
杨佳名 + 1

查看全部评分

21 个回复

倒序浏览
本帖最后由 爽亮前程 于 2014-12-4 10:28 编辑

因为你遍历到整个D盘。获取了所有目录,而有些系统目录是进不去的。没有权限访问。所以就报出了空指针异常。
我刚刚试了一下,也报这个异常,是因为D盘有回收站的隐藏文件夹,当遍历到回收站隐藏文件夹里面的文件夹时报出了这个异常。

评分

参与人数 2技术分 +1 黑马币 +12 收起 理由
杨佳名 + 1
date1130 + 12 非常感谢、、解决我一大头疼。.

查看全部评分

回复 使用道具 举报
不知道,来帮顶,没有技术分的穷孩子:'(

评分

参与人数 1黑马币 +12 收起 理由
date1130 + 12 淡定,加油。。。

查看全部评分

回复 使用道具 举报
if (f.isFile() && f.getName().endsWith(".class") )
尝试把24行代码加上判断条件f.isFile(),再试试
回复 使用道具 举报
我试了一下,加上空指针判断就可以了,代码如下
package Test.Demo;

import java.io.File;
import java.io.IOException;

public class TextDemo {

        public static void main(String[] args) throws IOException {

                File file = new File("f:\\");

                function(file);
        }

        public static void function(File file) {
                /***********加上这一句*********************/
                File[] arr = file.listFiles();
                if (arr == null) { // 判断一下是否为空
                        return;
                }
                /****************************************/

                for (File f : arr) {
                        if (f.isDirectory()) {
                                function(f);
                        } else {
                                if (f.getName().endsWith(".class")) {
                                        System.out.println(f);
                                }
                        }
                }
        }

}

评分

参与人数 1黑马币 +12 收起 理由
date1130 + 12 谢谢。

查看全部评分

回复 使用道具 举报
不知道isHidden() 能否判断文件夹,如果可以的话,可以将18行代码换成 if (!f.isHidden()&& f.isDirectory()) {

点评

非常棒  发表于 2014-12-4 12:13

评分

参与人数 1黑马币 +12 收起 理由
date1130 + 12 也是一个好方法。谢谢。

查看全部评分

回复 使用道具 举报
帮忙顶贴,原谅我们穷孩子不会!!
回复 使用道具 举报
as604049322 发表于 2014-12-4 10:59
if (f.isFile() && f.getName().endsWith(".class") )
尝试把24行代码加上判断条件f.isFile(),再试试 ...

试了下。这个方案不行的。
回复 使用道具 举报
bjuth 中级黑马 2014-12-4 13:07:49
9#
遇到过 没解决 up up up
回复 使用道具 举报
在读取有些敏感目录(比如:$RECYCLE.BIN)时,会返回null,所以在for前面来个判断:if(arr==null)return;
回复 使用道具 举报
这个问题  我以前也遇到过  
其实就是这个file.listFiles()这个方法的问题
遇到没有权限访问的文件夹就是直接返回空值  所以你在空值arr集合增强for循环的外面
加上一个if(arr!=null)就行了
回复 使用道具 举报
长知识了
回复 使用道具 举报
我运行了一下,只有最后有个地方报错

2.jpg (22.58 KB, 下载次数: 7)

2.jpg
回复 使用道具 举报
你没有判断是不是是隐藏文件,java拿不到隐藏文件的,会返回null,加个isHidden()方法判断下
回复 使用道具 举报
受教了!
回复 使用道具 举报
楼主真棒!!
回复 使用道具 举报
大神    黑马币欠缺中  求帮助
回复 使用道具 举报
我试着改了一下你的程序,没有异常了,但是还是获取不到以.class结尾的文件,但是譬如.txt的就可以
可能.class文件似乎不能够被访问。
  1. import java.io.File;

  2. public class Demo6 {

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

  4.                 File file = new File("G:\\");

  5.                 function(file);
  6.         }

  7.         public static void function(File file) {
  8.                 File[] arr = file.listFiles();
  9.                 if (arr.length == 0 || arr == null) {
  10.                         return;
  11.                 }

  12.                 for (File f : arr) {
  13.                         if (f==null || f.length() == 0){
  14.                                 continue;
  15.                         }
  16.                         if (f.isDirectory()) {
  17.                                 function(f);
  18.                         } else  {
  19.                                 if (f.getName().endsWith(".class")) {
  20.                                         System.out.println(f);
  21.                                 }
  22.                         }
  23.                 }
  24.         }
  25. }
复制代码
回复 使用道具 举报
首先分析出现空指针原因是你将整个D盘的文件作为对象,进行遍历listFiles();其中有的文件是隐藏形式 ,文件存在但访问不到,所以报错,解决的办法是在使用文件数组前先进行是否为空的判断就可以了,建议下次别直接访问D盘,你可能有的软件安装文件在里面。要练习敲代码,可寻找一个确定的文件进行遍历。
回复 使用道具 举报
进来学习了。。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马