for()与for-each的空指针问题

java中for()和for each的一个小不同

今天在做java的一个小练习时发现的一个小问题,希望能给大家带来帮助

题目如下

统计出D盘下所有文件夹(非文件)的个数,包括子文件夹里面的文件夹

使用递归就可写出来,具体代码如下,可是刚开始的时候老是出现空指针异常,下面是原先的代码

public class Folder{
	public static int count = 0;
	public static void main(String args[]) throws Exception{
		fun(new File("D:\\java"));
		System.out.println("D:\java目录下的文件夹数目为:" + count);
	}
	
	/**
	*查询一个文件的子文件夹数目
	*/
	public static void fun(File file)throws Exception{
		if(file.isDirectory()){
			File[] files = file.listFiles();
			//*****问题所在******		
			for(int i = 0; i < files.length; i++){
				if(files[i].isDirectory()){
					count++;
					fun(files[i]);
				}
			}
		}
	}
	
		
}

逻辑上好像是没什么问题,但是在我标注的地方有一个bug,就是当这个文件夹下没有任何东西,即一个空文件夹,那么他的.listFiles()就会返回null;files[]也就是null,在for() 循环的时候,files.length这里就会出空指针的问题,在前面加个判断即可解决

	/**
	*查询一个文件的子文件夹数目
	*/
	public static void fun(File file)throws Exception{
		if(file.isDirectory()){
			File[] files = file.listFiles();
			//*****问题所在******	
			//加判断
			/*//当该文件夹下没有任何内容时退出
			if(files == null){
				return;
			}	
			for(int i = 0; i < files.length; i++){
				if(files[i].isDirectory()){
					count++;
					fun(files[i]);
				}
			}
		}
	}

随后我使用for each实现,发现for each 不加判断也可以正常执行

public static void fun(File file)throws Exception{
		if(file.isDirectory()){
			File[] files = file.listFiles();
			//当files为null时,直接跳过循环,不会出现空指针异常
			//若是for(),则要做一次判断,否则会有异常
			for(File f : files){
				if(f.isDirectory()){
					count++;
					fun(f);
				}
			}
		}
	}

[总结]for each 遇到null会自动跳过,功能相对for()强大一点(不用再考虑索引方面的问题),简化了Collection或array的遍历过程。

你可能感兴趣的:(for()和for-each)