Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java异常链接问题_Java_Exception_Chaining - Fatal编程技术网

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上的方法)
不必捕获未检查的异常背后的思想是,它们表示您无法处理(VM错误)或不应该存在于正确调试的程序中(程序员错误)的故障(VM级别或程序员)


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

那么,如果存在不需要捕获的异常,则使用throws子句有什么意义呢?有时您希望在不必显式重试的情况下捕获异常。啊,那将是一个不错的选择。我可以看出这会导致懒惰。相反,更常见的是检查异常,你根本无法处理或不关心这些异常,而不是用空捕获来压缩它们,而不是实际记录或传播这些异常——例如,很多时候关闭时忽略IOException是有充分理由的,它应该是RuntimeException…IOException不应该是RuntimeException,因为它不表示程序员的错误-。