File类——遍历盘符根目录查找文件报错 java.lang.NullPointerException

编写java程序如下;

//示例程序1
package com.cskaoyan.Day15_HomeWork;
import java.io.File;
/*查找某个目录下的所有文件,但是不包括子文件夹下的文件。
 那如何找出一个文件及其所有子文件夹下的所有文件?
使用递归来解决。*/
public class Java_3
{
    public static void main(String[] args)
    {
        getFile("F:\\圣思源", "  ");
    }
//传入路径和空格 空格用来区分子目录
    public static void getFile(String path, String tab)
    {
//新建指向path路径的file实例
        File file = new File(path);
        // 判断文件及文件夹是否存在
        if (file.exists())
        {
//调用listFile遍历路径下所有的file实例
            File[] listFile = file.listFiles(); 
//遍历并循环输出file实例指向的文件名
                for (File file2 : listFile)
                {
                    System.out.println(tab + file2.getName());
//如果此file是文件夹,调用自身,传入当前文件夹的path 加两空格并换行以便区分
                    if (file2.isDirectory())
                    {
                        getFile(file2.getPath(), tab + "\t");
                    }
                }
        }
    }
}

以上程序在运行时正常输出,但在将遍历的文件目录改为根盘符,比如

getFile("F:", "  ");

扫描出一部分文件后出现报错

        listfile.txt
        小米2A合并MIUI7分区工具箱 V1.1.bat
    小米2A合并MIUI7分区工具箱 V1.1.zip
  QQMusicCache
    Log
        DataTransformex
        QQMusicAgent
        QQMusicService
        QQMusicSvr
        QQMusic_Setup_1273-12.73.3461.0727
  System Volume Information
Exception in thread "main" java.lang.NullPointerException
    at com.cskaoyan.Day15_HomeWork.Java_3.getFile(Java_3.java:22)
    at com.cskaoyan.Day15_HomeWork.Java_3.getFile(Java_3.java:27)
    at com.cskaoyan.Day15_HomeWork.Java_3.main(Java_3.java:10)

放上以前编写的单独扫描目录下文件及文件夹的代码

//示例程序2
public static void main(String[] args)
    {
        File file = new File("F:");
        // 打印对象特性
        if (file.exists() && file.isDirectory())
        {
            File[] listFiles = file.listFiles(); // java.lang.NullPointerException
            for (File file2 : listFiles)
            {
                System.out.println(file2.getName());
            }
        }

正常输出,并没有报错,于是关注异常信息

java.lang.NullPointerException

于是我进一步在目录下新建一个空文件夹,再次遍历扫描,也没有报错,说明空文件夹并不是其报错野指针异常的原因。
查看此类的api文档,其报错原因如下几种,

当应用程序试图在需要对象的地方使用 null 时,抛出该异常,这种情况包括: 

调用 null 对象的实例方法
访问或修改 null 对象的字段 
将 null 作为一个数组,获得其长度
将 null 作为一个数组,访问或修改其时间片 
将 null 作为 Throwable 值抛出
应用程序应该抛出该类的实例,指示其他对 null 对象的非法使用

关注 System Volume Information文件夹,

System Volume Information”是windows系统文件夹
是隐藏文件

中文名称可以翻译为“系统卷标信息”
这个文件夹里就存储着系统还原的备份信息
System Volume Information 文件夹是一个隐藏的系统文件夹
"系统还原"工具使用该文件夹来存储它的信息和还原点

修改其属性,重新用最初程序遍历文件发现程序运行正常



由此确定错误来自System Volume Information 文件夹的权限问题,修改程序循环调用,问题解决了

public static void getFile(String path, String tab)
    {
        File file = new File(path);
        if (file.exists())
        {
            File[] listFile = file.listFiles();
   //如果listFile接收的实例不为null 才进入循环 
            if (listFile != null)
            {
                for (File file2 : listFile)
                {
                    System.out.println(tab + file2.getName());
                    if (file2.isDirectory())
                    {
                        getFile(file2.getPath(), tab + "\t");
                    }
                }
            }
        }
    }

总结问题原因及API中解释结果如下

原因:
遍历到F盘下的System Volume Information目录时,
用户没有访问权限,所以调用listFile方法会返回null

API文档中关于listFile()的描述:
返回抽象路径名数组
这些路径名表示此抽象路径名表示的目录中的文件和目录
如果目录为空,那么数组也将为空
如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null

我不由得又滋生了两个问题(均已测试完成)
1.既然调用listFile方法会返回null,为什么示例程序2中调用file.getName()不会报错?
2.修改完System Volume Information目录权限之后,以可正常访问,示例程序1已正常运行,可为何在输出结果中找不到System Volume Information目录?

若有大神看到,求不吝解惑,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,011评论 2 34
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,292评论 18 399
  • 我坐在电脑前,嘴里叼根烟,一圈一圈吐着烟圈,打着游戏骂着猪 桀骜不驯,只是表面 右手边放着一面镜子,镜子里面却是另...
    就是丑人阅读 231评论 0 6
  • 8/9,晚上10点,咸阳,天气晴 成都----西安---咸阳,800多公里 在头一天晚上将所有的行李全部搬到车上了...
    四季树语阅读 616评论 3 4