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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

关于盘符根目录的递归遍历,如果稍微不注意,就会出现空指针异常问题,你们都知道为什么吗?举个例子:如果是要遍历 File f = new File("c:\\")
我们都知道,C盘下,有很多系统的文件,那些文件的读取,都是需要管理员权限,或者是,根本就不让你写,不让你读,也不让你删除,还有一部分是不可见的,那么对于这些问题的遍历文件夹呢,通常,我们的判断条件要非常谨慎才行,不然很容易就会报出空指针异常,具体的代码如下:
package com.heima.test;

import java.io.File;

public class TestDemo01 {
    public static void main(String[] args) {
        File f = new File("c:\\");
        getPics(f);
    }
    /**
     * 这个方法是用于获取文件夹及子文件夹的下所有图片
     * 1,返回参数:void
     * 2,File对象
     */
    public static void getPics(File path){
        //第一步:想办法获取到给定的文件夹下的所有文件和文件夹对象
         //path.listFiles()这个方法的底层代码,很有可能会返回一个null,如果返回是的null,那么使用null来调用方法的话,就会出现空指针异常
        File[] files = path.listFiles();
        if(files != null){  //判断返回的不为null
            for(File f: files){
                //如果是目录(文件夹),就递归,如果是文件 就判断是否是图片文件
                if(f.isDirectory() && !f.isHidden()){   //判断是文件夹并且是可见的
                    getPics(f);
                }else if(f.isFile() && f.getName().endsWith(".jpg")){
                    System.out.println(f);
                }
            }
        }
    }
}


7 个回复

倒序浏览
回复 使用道具 举报
bluehat 发表于 2016-9-29 00:27
用过滤器也可以

我没试过用过滤器遇到这个问题
回复 使用道具 举报
感觉没必要这个判定没必要
回复 使用道具 举报
haoge349 发表于 2016-9-29 00:34
感觉没必要这个判定没必要

没必要?那你去迭代一下C:\试试,或者别的盘符的根目录,看看会不会出现空指针异常
回复 使用道具 举报
李春林 发表于 2016-9-30 00:42
没必要?那你去迭代一下C:\试试,或者别的盘符的根目录,看看会不会出现空指针异常
...

        public static void main(String[] args) {
                List<String> list = new ArrayList<String>();
                int[] arr = {};
                System.out.println(list.size() == 0);//true
                System.out.println(list == null);//false
                System.out.println(arr.length == 0);//true
                System.out.println(arr == null);//false
通过File[] files = path.listFiles();这一步生成的数组哪怕为空数组,也不会等于null.
回复 使用道具 举报
有时候,对于可能出现的空指针异常,多做处理也好,就一个判断,不会影响程序的效率的
回复 使用道具 举报
我们点招的时候考了这个知识点,我但是也是纠结这个异常,但是为什么我把后面的\\去掉了,就可以了?求回复
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马