想象一下,我有方法:
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
答案 0 :(得分:9)
IndexOutofBoundsException延伸RuntimeException。它是一个runtimeexception,不需要检查。
答案 1 :(得分:4)
异常层次结构的顶部是java.lang.Throwable。它是一个经过检查的异常(编译器会强制您捕获它或声明您将其抛出)。
在Throwable下面有Exception,也是一个已检查的异常,以及Error,一个未经检查的异常(编译器不会对此发出警告)。
在Exception下面有RuntimeException,也是一个未经检查的异常。
Java设计者使用异常的方式是:
不必捕获未经检查的异常背后的想法是它们表示您无法处理(VM错误)或不应该存在于正确调试的程序(程序员错误)中的故障(VM级别或程序员)。
并非所有人都同意Java设计者的意图,并选择使用RuntimeException来表示程序员错误以外的事情。