【问题标题】:java exception chaining questionjava异常链接问题
【发布时间】:2009-04-04 04:18:27
【问题描述】:

想象一下我有方法:

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 为什么不需要围绕这个抛出异常的 java api 方法执行 try-catch 块。 funcB 在没有 try-catch 块的情况下编译得很好。我相信答案与java api方法抛出异常但未声明为“抛出IndexOutOfBoundsException”的事实有关

函数链:funcA() -> funcB() -> ByteBuffer.wrap(...)

我的下一个问题是当我 DO 将 funcB 更改为“funcB() throws IndexOutOfBoundsException”时,为什么 funcA 不需要捕获 funcB 抛出的异常?编译器是否深入挖掘并意识到 ByteBuffer.wrap(...) 没有声明为“wrap() throws IndexOutOfBoundsException”,所以所有调用者实际上不需要捕获任何东西,甚至是子调用者(在这种情况下是 funcB)被声明为“funcB throws IndexOutOfBoundsException”?

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

请帮忙。

jbu

【问题讨论】:

    标签: java exception chaining


    【解决方案1】:

    IndexOutofBoundsException 扩展 RuntimeException。它是一个运行时异常,不需要检查。

    unchecked exceptions - the controversy.

    【讨论】:

    • 如果存在不需要捕获的异常,那么使用 throws 子句有什么意义?
    • 有时您希望选择捕获异常而不必显式重新抛出。
    • 啊,那将是一个不错的选择。我可以看到它会导致懒惰。
    • 相反的情况更常见——检查的异常你根本无法处理或不关心,而不是被空捕获压制而不是实际记录或传播——例如,很多时候 IOException on close 被忽略是有充分理由的,它应该是一个 RuntimeException...
    • IOException 不应该是 RuntimeException,因为它并不表示程序员的错误 - stackoverflow.com/questions/588546/….
    【解决方案2】:

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

    在 Throwable 下面有 Exception,也是一个检查的异常,还有 Error,一个未经检查的异常(编译器不会警告你)。

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

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

    • 例外,可能出错的地方
    • 错误,低级别的事情可能出错并且程序无法从中恢复
    • RuntimeException、程序员错误(如超出数组末尾,或在 null 上调用方法)。

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

    并不是每个人都同意 Java 设计者对此的意图,并选择使用 RuntimeException 来表示程序员错误以外的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-05
      • 2019-10-21
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多