Java 6和Java 7对throw语句的不同理解

1 代码示例

import java.io.*;

public class ThrowTest2
{
	public static void main(String[] args)
		// Java 6认为①号代码可能抛出Exception,
		// 所以此处声明抛出Exception
		throws Exception
		// Java 7会检查①号代码可能抛出异常的实际类型,
		// 因此此处只需声明抛出FileNotFoundException即可。
		//throws FileNotFoundException
	{
		try
		{
			new FileOutputStream("a.txt");
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			throw ex;        // ①
		}
	}
}

2 代码分析

Java 6对该代码理解:Java编译器处理“简单而粗暴”——由于在捕获该异常时声明ex类型是Exception,因此Java编译器认为这段代码可能抛出Exception异常,所以包含这段代码的方法通常需要声明抛出Exception异常。

Java 7对该代码理解:Java编译器会执行更细致的检查,Java 编译器会检查throw语句抛出异常的实际类型,这样编译器知道①号代码处实际上只可能抛出FileNotFoundException异常,因此在方法签名中只声明抛出FileNotFoundException异常即可。

猜你喜欢

转载自cakin24.iteye.com/blog/2325483