java异常链接问题

时间:2009-04-03 19:48:19

标签: java exception chaining

想象一下,我有方法:

public static void funcA() {...}

public static void funcB() 
{
    byteBuffer.wrap(someByteArray, 0, someByteArra.length);
}

IN JAVA API:

public static ByteBuffer wrap(byte[]array, int offset, int length)
{
    try {
        return new HeapByteBuffer(array, offset, length);
    } catch (IllegalArgumentException x) {
        throw new IndexOutOfBoundsException();
    }
}

功能链:funcB() - > ByteBuffer.wrap()

我的问题是为什么funcB不需要围绕抛出异常的java api方法执行try-catch块。没有try-catch块,funcB编译得很好。我相信答案与java api方法引发异常但是因为“抛出IndexOutOfBoundsException”

这一事实有关。

功能链:funcA() - > funcB() - > ByteBuffer.wrap(...)

我的下一个问题是当我 DO 将funcB更改为“funcB()抛出IndexOutOfBoundsException”时,为什么funcA不需要捕获funcB抛出的异常?编译器是否深入挖掘并意识到ByteBuffer.wrap(...)未被声明为“wrap()抛出IndexOutOfBoundsException”因此所有调用者实际上不需要捕获任何内容甚至是子调用者(在本例中为funcB)被声明为“funcB抛出IndexOutOfBoundsException”?

很抱歉,如果这令人困惑或难以理解。

请帮忙。

JBU

2 个答案:

答案 0 :(得分:9)

IndexOutofBoundsException延伸RuntimeException。它是一个runtimeexception,不需要检查。

请参阅unchecked exceptions - the controversy.

答案 1 :(得分:4)

异常层次结构的顶部是java.lang.Throwable。它是一个经过检查的异常(编译器会强制您捕获它或声明您将其抛出)。

在Throwable下面有Exception,也是一个已检查的异常,以及Error,一个未经检查的异常(编译器不会对此发出警告)。

在Exception下面有RuntimeException,也是一个未经检查的异常。

Java设计者使用异常的方式是:

  • 例外,可能出错的事情
  • 错误,可能出错的低级别内容以及程序无法从
  • 恢复
  • RuntimeException,程序员错误(比如越过数组的末尾,或者调用null的方法)。

不必捕获未经检查的异常背后的想法是它们表示您无法处理(VM错误)或不应该存在于正确调试的程序(程序员错误)中的故障(VM级别或程序员)。

并非所有人都同意Java设计者的意图,并选择使用RuntimeException来表示程序员错误以外的事情。