编写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目录?
若有大神看到,求不吝解惑,谢谢