java异常链接问题
假设我有以下方法:java异常链接问题,java,exception,chaining,Java,Exception,Chaining,假设我有以下方法: public static void funcA() {...} public static void funcB() { byteBuffer.wrap(someByteArray, 0, someByteArra.length); } 在JAVA API中: public static ByteBuffer wrap(byte[]array, int offset, int length) { try { return new Hea
public static void funcA() {...}
public static void funcB()
{
byteBuffer.wrap(someByteArray, 0, someByteArra.length);
}
在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不需要围绕这个抛出异常的javaapi方法执行try-catch块呢。funcB编译很好,没有try-catch块。我相信答案与以下事实有关:java api方法抛出异常,但没有声明为“抛出IndexOutOfBoundsException”
函数链:funcA()->funcB()->ByteBuffer.wrap(…)
我的下一个问题是,当我将funcB更改为“funcB()抛出IndexOutOfBoundsException”时,funcA为什么不需要捕获funcB抛出的异常?编译器是否深入挖掘并意识到ByteBuffer.wrap(…)没有声明为“wrap()抛出IndexOutOfBoundsException”,因此所有调用方实际上不需要捕获任何内容,甚至子调用方(在本例中为funcB)实际上也声明为“funcB抛出IndexOutOfBoundsException”
抱歉,如果这让人困惑或难以理解
请帮忙
jbu扩展了。这是一个运行时异常,不需要检查
请参见异常层次结构顶部的java.lang.Throwable。它是一个已检查的异常(编译器强制您捕获它或声明您抛出它) 在Throwable下面有一个异常,也是一个已检查的异常,还有一个错误,一个未检查的异常(编译器不会就此向您发出警告) 在Exception下面是RuntimeException,也是一个未检查的异常 Java设计人员打算使用的异常方式是:
- 例外,可能出错的事情
- 错误,低级的事情,可能会出错,程序无法从中恢复
- RuntimeException、程序员错误(如超过数组末尾或调用null上的方法)
并非所有人都同意Java设计者的意图,并选择使用RuntimeException来表示除程序员错误以外的其他意思。那么,如果存在不需要捕获的异常,则使用throws子句有什么意义呢?有时您希望在不必显式重试的情况下捕获异常。啊,那将是一个不错的选择。我可以看出这会导致懒惰。相反,更常见的是检查异常,你根本无法处理或不关心这些异常,而不是用空捕获来压缩它们,而不是实际记录或传播这些异常——例如,很多时候关闭时忽略IOException是有充分理由的,它应该是RuntimeException…IOException不应该是RuntimeException,因为它不表示程序员的错误-。