黑马程序员技术交流社区

标题: 程序报错求解? [打印本页]

作者: 山雨欲来风满楼    时间: 2016-9-20 00:20
标题: 程序报错求解?
/**
         *在控制台打印 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);
                        }
                }
        }

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


作者: java程序猿    时间: 2016-9-20 00:23
File[] f = file.listFiles();  这一块有可能获取到null值,你下面在增强for循环的时候,就报空指针异常了, 解决方法就是  File[] f = file.listFiles();  加上 if(f != null) {}
作者: jiubaK    时间: 2016-9-20 00:28
[Java] 纯文本查看 复制代码
if(file2.isFile() && file2.getName().endsWith(".jpg")){
                                System.out.println(file2);
                        }else {
                                getJpg(file2);
                        }

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

2楼是对的,我试过! ,但有一个问题是: File[] f = file.listFiles(); 这里的f 在什么情况下,会为空啊? 我做过好多实验,比如在一个文件夹中建空文件夹,也没报错啊
作者: 山雨欲来风满楼    时间: 2016-9-21 00:24
已解决!谢谢各位!else里面要判断是否是文件夹并且还不是被影藏的,如果不加&& !file.isHidden() 也会报错
作者: 读书可以当饭吃    时间: 2016-9-21 11:07
我也遇到过这个问题,最后是在for循环外加一个判断,如果获取到的文件数组是空,就不循环了,然后问题就解决了。
作者: java程序猿    时间: 2016-9-21 13:49
Fate_stay 发表于 2016-9-20 22:45
2楼是对的,我试过! ,但有一个问题是: File[] f = file.listFiles(); 这里的f 在什么情况下,会为空啊? 我 ...

你设置一个文件访问权限什么的都设置成不可访问等,就可以做到了
作者: 暴躁的熊二    时间: 2016-9-21 14:25
看懵逼了
作者: evan.zhou    时间: 2016-9-21 15:27
[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的判断!
作者: lipeng518    时间: 2016-9-21 15:34
应该有可能遇到null值把
作者: Fate_stay    时间: 2016-9-21 21:13
java程序猿 发表于 2016-9-21 13:49
你设置一个文件访问权限什么的都设置成不可访问等,就可以做到了

恩谢谢啦
作者: 愿望变美    时间: 2016-9-22 00:12
[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);
                    }
            }
    }


因为根目录下常常会有不可见或搜索时拒绝访问的文件,没办法访问到的




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