关于Final Rethrow

时间:2015-06-18 21:15:35

标签: java exception-handling try-catch ioexception

我在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

的throws子句
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子句中不会产生错误。

为什么?

2 个答案:

答案 0 :(得分:4)

你提到的引用是误导性的:

  • 如果您的方法体中可能抛出了已检查的异常,则必须在方法的throws子句中声明它。
  • 但您可以将任何异常添加到方法的throws子句中,无论它是否实际可以抛出。

例如,这个编译:

public void m() throws IOException {}

答案 1 :(得分:1)

我认为你误解了文章陈述这种情况的背景。文章说在Java 7中,{em> not 在Exception子句中声明throws OK如果throws子句声明实际的异常由try引发,即OpenExceptionCloseException。从某种意义上说,Java 7的编译器现在足够聪明,知道OpenException块只能抛出CloseExceptiontry。因此,不再需要该方法声明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中编译。