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 文件夹是一个隐藏的系统文件夹
"系统还原"工具使用该文件夹来存储它的信息和还原点

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


File类——遍历盘符根目录查找文件报错 java.lang.NullPointerException_第1张图片

由此确定错误来自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目录?

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

你可能感兴趣的:(File类——遍历盘符根目录查找文件报错 java.lang.NullPointerException)