黑马程序员技术交流社区

标题: 送技术分,求大神,不只一次遇到这种问题了,一直无解, [打印本页]

作者: date1130    时间: 2014-12-4 10:10
标题: 送技术分,求大神,不只一次遇到这种问题了,一直无解,
本帖最后由 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文件,走到最后的时候,直接报出空指针异常,不只一次遇到了,有时候重新写一遍,但是明明还是这样写,就没事了。望大神指点,技术分送上。这个代码是会出空指针异常的代码。

作者: 爽亮前程    时间: 2014-12-4 10:27
本帖最后由 爽亮前程 于 2014-12-4 10:28 编辑

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

作者: 人比黄瓜瘦    时间: 2014-12-4 10:35
不知道,来帮顶,没有技术分的穷孩子:'(
作者: as604049322    时间: 2014-12-4 10:59
if (f.isFile() && f.getName().endsWith(".class") )
尝试把24行代码加上判断条件f.isFile(),再试试
作者: 金福林    时间: 2014-12-4 11:06
我试了一下,加上空指针判断就可以了,代码如下
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);
                                }
                        }
                }
        }

}

作者: as604049322    时间: 2014-12-4 11:08
不知道isHidden() 能否判断文件夹,如果可以的话,可以将18行代码换成 if (!f.isHidden()&& f.isDirectory()) {
作者: liuhao0324    时间: 2014-12-4 11:31
帮忙顶贴,原谅我们穷孩子不会!!
作者: 爽亮前程    时间: 2014-12-4 12:11
as604049322 发表于 2014-12-4 10:59
if (f.isFile() && f.getName().endsWith(".class") )
尝试把24行代码加上判断条件f.isFile(),再试试 ...

试了下。这个方案不行的。
作者: bjuth    时间: 2014-12-4 13:07
遇到过 没解决 up up up
作者: quick3g    时间: 2014-12-4 14:06
在读取有些敏感目录(比如:$RECYCLE.BIN)时,会返回null,所以在for前面来个判断:if(arr==null)return;
作者: 默默丶    时间: 2014-12-4 14:18
这个问题  我以前也遇到过  
其实就是这个file.listFiles()这个方法的问题
遇到没有权限访问的文件夹就是直接返回空值  所以你在空值arr集合增强for循环的外面
加上一个if(arr!=null)就行了
作者: 夏俊男    时间: 2014-12-4 14:21
长知识了
作者: 二月的雨    时间: 2014-12-4 15:37
我运行了一下,只有最后有个地方报错

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

2.jpg

作者: 壹贰叁    时间: 2014-12-4 15:57
你没有判断是不是是隐藏文件,java拿不到隐藏文件的,会返回null,加个isHidden()方法判断下
作者: 没伞的孩子    时间: 2014-12-4 16:53
受教了!
作者: qq623324733    时间: 2014-12-4 19:21
楼主真棒!!
作者: 小凡_fly    时间: 2014-12-4 20:38
大神    黑马币欠缺中  求帮助

作者: 。烊了    时间: 2014-12-4 21:00
我试着改了一下你的程序,没有异常了,但是还是获取不到以.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. }
复制代码

作者: SpiderManZZH    时间: 2014-12-4 22:31
首先分析出现空指针原因是你将整个D盘的文件作为对象,进行遍历listFiles();其中有的文件是隐藏形式 ,文件存在但访问不到,所以报错,解决的办法是在使用文件数组前先进行是否为空的判断就可以了,建议下次别直接访问D盘,你可能有的软件安装文件在里面。要练习敲代码,可寻找一个确定的文件进行遍历。
作者: Afridoce    时间: 2014-12-4 22:43
进来学习了。。
作者: 娱尘    时间: 2014-12-4 23:34
应该是权限访问问题,系统好的文件需要权限访问,加个if(arr!=null)判断下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2