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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山雨欲来风满楼 中级黑马   /  2016-9-20 00:20  /  1196 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
         *在控制台打印 E 盘中所有的”.jpg“ 文件
         */
        public static void main(String[] args) {
                File file = new File("E:\\");
                getJpg(file);
        }
       
        public static void getJpg(File file){
                File[] f = file.listFiles();
               
                for (File file2 : f) {
                        if(file2.isFile() && file2.getName().endsWith(".jpg")){
                                System.out.println(file2);
                        }else {
                                getJpg(file2);
                        }
                }
        }

//感觉代码没有错啊,但是运行出来报空指针异常,求解释

15 个回复

倒序浏览
File[] f = file.listFiles();  这一块有可能获取到null值,你下面在增强for循环的时候,就报空指针异常了, 解决方法就是  File[] f = file.listFiles();  加上 if(f != null) {}
回复 使用道具 举报 1 0
[Java] 纯文本查看 复制代码
if(file2.isFile() && file2.getName().endsWith(".jpg")){
                                System.out.println(file2);
                        }else {
                                getJpg(file2);
                        }

这个代码,if里面有可能是文件但不是jpg文件,从而到else,递归
而如果是文件,调用listFiles,得到null
回复 使用道具 举报
Java程序好像不能直接读取盘符,点招考试也出现过类似读取盘符的题目,貌似没有人做出来吧
回复 使用道具 举报
如果你的代码没错那就是有的文件是系统保护不让读取和操作
回复 使用道具 举报
2楼是正确的,你加个判断条件就好
回复 使用道具 举报
判断文件是不是文件且以.jpg结尾之后的else是错误的,因为还有可能是文件但不是以.jpg结尾.需要进一步判断.另外,你的代码有毒,我直接复制的运行部了,自己重写一遍就能正常运行了
回复 使用道具 举报
java程序猿 发表于 2016-9-20 00:23
File[] f = file.listFiles();  这一块有可能获取到null值,你下面在增强for循环的时候,就报空指针异常了 ...

2楼是对的,我试过! ,但有一个问题是: File[] f = file.listFiles(); 这里的f 在什么情况下,会为空啊? 我做过好多实验,比如在一个文件夹中建空文件夹,也没报错啊
回复 使用道具 举报
已解决!谢谢各位!else里面要判断是否是文件夹并且还不是被影藏的,如果不加&& !file.isHidden() 也会报错
回复 使用道具 举报
我也遇到过这个问题,最后是在for循环外加一个判断,如果获取到的文件数组是空,就不循环了,然后问题就解决了。
回复 使用道具 举报
Fate_stay 发表于 2016-9-20 22:45
2楼是对的,我试过! ,但有一个问题是: File[] f = file.listFiles(); 这里的f 在什么情况下,会为空啊? 我 ...

你设置一个文件访问权限什么的都设置成不可访问等,就可以做到了
回复 使用道具 举报
暴躁的熊二 来自手机 中级黑马 2016-9-21 14:25:06
12#
看懵逼了
回复 使用道具 举报
[Java] 纯文本查看 复制代码
import java.io.File;

public class Listavi {
	public static void main(String[] args) {
		File f = new File("D:\\");
		getAvis(f);
	}

	public static void getAvis(File file) {
		File[] files = file.listFiles();
		if (files != null) {
			for (File tempfile : files) {
				if (tempfile != null) {
					if (tempfile.isFile() && tempfile.getName().endsWith(".avi")) {
						System.out.println(tempfile);
					} else {
						getAvis(tempfile);
					}
				}
			}
		}
	}
}


官方对listFiles()方法的解释:
Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname.

If this abstract pathname does not denote a directory, then this method returns null.
所以要加个为null的判断!
回复 使用道具 举报
应该有可能遇到null值把
回复 使用道具 举报
java程序猿 发表于 2016-9-21 13:49
你设置一个文件访问权限什么的都设置成不可访问等,就可以做到了

恩谢谢啦
回复 使用道具 举报
[AppleScript] 纯文本查看 复制代码
public static void main(String[] args) {
            File file = new File("E:\\");
            getJpg(file);
    }
    
    public static void getJpg(File file){
            File[] f = file.listFiles();
            if(f == null){
            	return ;//就就加这部分
            }
            for (File file2 : f) {
                    if(file2.isFile() && file2.getName().endsWith(".jpg")){
                            System.out.println(file2);
                    }else {
                            getJpg(file2);
                    }
            }
    }


因为根目录下常常会有不可见或搜索时拒绝访问的文件,没办法访问到的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马