首页 > 解决方案 > 通过继承运行时异常来“绕过” throws 子句

问题描述

问:有什么办法可以“绕过” throws 子句对方法的严格限制?

根据我的说法,我们可以通过使用 try-catch 来“绕过” throws 子句,但我找到的答案是 -

答:是的。假设您经过深思熟虑并决定需要规避此限制。几乎从来没有这种情况,因为正确的解决方案是返回并重新设计您的方法以反映您需要抛出的异常。然而,想象一下,由于某种原因,系统类让你束手无策。您的第一个解决方案是继承 RuntimeException 以组成您自己的新的豁免异常。现在您可以随心所欲地扔它了,因为烦人的 throws 子句不需要包含这个新异常。如果您需要大量此类异常,一种优雅的方法是将一些新颖的异常接口混合到您的新运行时类中。您可以自由选择要捕获的这些新接口的任何子集(不需要捕获任何正常的运行时异常),

当我可以简单地使用 try-catch 时,我不明白为什么需要子类化运行时异常?另外请给我一个程序,我们将运行时异常子类化为“绕过” throws 子句。

标签: javaexceptiontry-catchruntimethrows

解决方案


我认为您可能正在考虑与您发布的答案不同的 throws 子句设置的“绕过”限制的概念。已检查与未检查的异常。

未经检查的异常不需要在方法的 throws 子句中声明。此外,您可以调用可能抛出未经检查的异常的方法,无论是否使用 try/catch。因此,您可以从给定方法抛出额外的运行时异常,而无需修改其 throws 子句或调用代码。

另一方面,抛出已检查(异常的子类)异常的方法需要在其 throws 子句中声明这些异常。调用方法必须使用 try/catch 包装检查异常抛出方法的调用,或者将其自己的 throws 子句添加到其方法签名中。

public class TestClass {

    public static void main(String[] args) {
        new TestExceptionClass().uncheckedExceptionMethod();
        new TestExceptionClass().checkedExceptionMethod(); // does not compile, needs to be wrapped in try/catch or declared w/ throws keyword in main method
    }
}

class TestExceptionClass {

    void uncheckedExceptionMethod() {  // unchecked exceptions do not need to be included in throws
        throw new MyRuntimeException();
    }

    void checkedExceptionMethod() throws Exception {  // checked exceptions need to be included in throws
        throw new Exception();
    }
}

class MyRuntimeException extends RuntimeException { }

推荐阅读