我在Precise Rethrow
的文档中读到了http://www.theserverside.com/tutorial/OCPJP-Use-more-precise-rethrow-in-exceptions-Objective-Java-7
基本上,您可以在方法的throws子句中列出特定的异常,即使它们没有由catch块显式处理,如果:
try块实际上会在某个时间点抛出该特定异常。
前面的catch块
在任何时候都没有处理特定的Exception方法签名的throws子句中指定的异常必须位于至少一个由catch块(子类型或超类型)处理和重新抛出的异常的类层次结构上
main
)class OpenException extends Exception {}
class CloseException extends Exception {}
public class PRethrow
{
public static void main(String args[]) throws OpenException, CloseException, java.io.IOException
{
boolean flag = true;
try
{
if (flag)
{
throw new OpenException();
}
else
{
throw new CloseException();
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
throw e;
}
}
}
在第一个条件中明确提到you can list a specific exception in throws clause if the try block actually throws that specific exception at some point in time.
在我的代码中,try块从不抛出java.io.IOException
,但仍然将它包含在throws子句中不会产生错误。
答案 0 :(得分:4)
你提到的引用是误导性的:
throws
子句中,无论它是否实际可以抛出。例如,这个编译:
public void m() throws IOException {}
答案 1 :(得分:1)
我认为你误解了文章陈述这种情况的背景。文章说在Java 7中,{em> not 在Exception
子句中声明throws
是 OK如果throws
子句声明实际的异常由try
块引发,即OpenException
和CloseException
。从某种意义上说,Java 7的编译器现在足够聪明,知道OpenException
块只能抛出CloseException
和try
。因此,不再需要该方法声明throws Exception
。
这与IOException
无关,并且它不会改变这样一个事实,即无论是否实际抛出异常,都可以声明抛出任何异常。 throws
子句只是方法API的一部分。
本文所述条件的全部内容如下:
public static void main(String args[]) throws OpenException, CloseException,
java.io.IOException
{
boolean flag = true;
try
{
if (flag)
{
throw new OpenException();
}
else
{
throw new CloseException();
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
throw e; // this causes a compilation error before Java 7
}
}
在Java 7中编译,但在Java 6中编译。