28

在 Java 中,是否可以创建一个throws不检查语句的方法。

例如:

public class TestClass {
    public static void throwAnException() throws Exception {
        throw new Exception();
    }
    public static void makeNullPointer() {
        Object o = null;
        o.equals(0);//NullPointerException
    }
    public static void exceptionTest() {
        makeNullPointer(); //The compiler allows me not to check this
        throwAnException(); //I'm forced to handle the exception, but I don't want to
    }
}
4

10 回答 10

55

您可以尝试对此不做任何事情:

public static void exceptionTest() {
    makeNullPointer(); //The compiler allows me not to check this
    try {
        throwAnException(); //I'm forced to handle the exception, but I don't want to
    } catch (Exception e) { /* do nothing */ }
}

请记住,在现实生活中这是非常不明智的。这可以隐藏一个错误,让你整整一周都在寻找狗,而问题实际上是一只猫(ch)。(来吧,至少放一个System.err.println()- 记录是这里的最佳实践,正如@BaileyS 所建议的那样。)

Java 中的未经检查的异常扩展了RuntimeException类。投掷它们不会要求catch客户提供:

// notice there's no "throws RuntimeException" at the signature of this method
public static void someMethodThatThrowsRuntimeException() /* no need for throws here */ {
    throw new RuntimeException();
}

扩展的类RuntimeException也不需要throws声明。

来自甲骨文的一句话

这是底线准则:如果可以合理地期望客户端从异常中恢复,则将其设为已检查异常。如果客户端无法从异常中恢复,请将其设为未经检查的异常。

于 2013-05-24T02:34:14.557 回答
4

您可以做 3 件事:

  • 抛出 a RuntimeException(或扩展 a 的东西RuntimeException,如NullPointerException, IllegalArgumentException,...),您不必捕获它们,因为它们是未经检查的异常。

  • 捕获异常并且什么都不做(不推荐):

    public static void exceptionTest() {
        makeNullPointer(); //The compiler allows me not to check this
        try {
            throwAnException(); //I'm forced to handle the exception, but I don't want to
        } catch (Exception e) {
            // Do nothing
        }
    }
    
  • 更改exceptionTest ()声明说它抛出一个Exception,并让调用它的方法捕获Exception并做适当的事情:

    public static void exceptionTest() throws Exception {
        makeNullPointer(); //The compiler allows me not to check this
        throwAnException(); //I'm no more forced to handle the exception
    }
    
于 2013-05-24T02:48:28.347 回答
3

Java中有两种异常,检查异常和未检查异常。

  • Exception是一个已检查的异常,必须捕获或抛出。
  • NullPointerException是一个RuntimeException,(编译器不会强制它们在 throws 子句中声明)你可以忽略它,但它仍然可能发生在Runtime中,你的应用程序会崩溃。

来自异常文档:

类 Exception 和任何不是 RuntimeException 子类的子类都是检查异常。如果检查的异常可以通过方法或构造函数的执行抛出并传播到方法或构造函数边界之外,则需要在方法或构造函数的 throws 子句中声明它们。

RuntimeException文档:

RuntimeException 是可以在 Java 虚拟机正常运行期间抛出的那些异常的超类。

RuntimeException 及其子类是未经检查的异常。如果未经检查的异常可以通过方法或构造函数的执行抛出并传播到方法或构造函数边界之外,则不需要在方法或构造函数的 throws 子句中声明它们。

于 2013-05-24T02:38:14.277 回答
2

不,它会引发编译器错误。作为一个检查异常,你必须要么捕获它,要么通过将你的方法声明为可能抛出它来传播它。检查这个这个

于 2013-05-24T02:33:12.210 回答
1

据我所知,在这种情况下这是不可能的。只有未经检查的异常,编译器可以跳过检查。比如运行时异常。

于 2013-05-24T02:35:45.640 回答
1

抛出一个RuntimeException或一个派生自的异常RuntimeException。那么编译器不会强迫你去捕捉它。

于 2013-05-24T02:41:03.420 回答
1

其他答案是正确的,因为它们正确地告诉您该做什么,但实际上有可能抛出未声明的检查异常。有几种方法可以做到这一点;最简单的是:

public void methodThatSecretlyThrowsAnException() {
    Thread.currentThread().stop(new Exception());
}

或者如果您的目标是包装一个声明其异常的现有方法

public void methodThatSecretlyThrowsAnException() {
    try {
        methodThatAdmitsItThrowsAnException();
    } catch(final Exception e) {
        Thread.currentThread().stop(e);
    }
}

(不用说,你永远不应该这样做。)

于 2013-05-24T04:56:06.927 回答
1

只需捕获一个异常,不要对它做任何事情,保持原样并捕获通用异常,以防您不知道特定异常

try{
//Your logic goes here
}
catch(Exception e)//Exception is generic
{
//do nothing
}
于 2013-05-24T05:29:49.443 回答
1

您可以使用 Java 编译器中的漏洞。添加以下代码:

public RuntimeException hideThrow(Throwable e) {
    if (e == null)
        throw new NullPointerException("e");
    this.<RuntimeException>hideThrow0(e);
    return null;
}

@SuppressWarnings("unchecked")
private <GenericThrowable extends Throwable> void hideThrow0(Throwable e) throws GenericThrowable {
    throw (GenericThrowable) e;
}

您可以捕获异常,然后hideThrow使用异常调用以在编译器不注意的情况下将其抛出。这是因为类型擦除而起作用的。在编译时,GenericThrowable表示RuntimeException因为那是我们传递的内容。在运行时,GenericThrowable表示Throwable因为那是类型参数规范中的基本类型。

于 2018-07-01T23:41:49.110 回答
0

即使您完全确定在任何情况下都不会失败,也不建议避免带有空 catch 块的异常。有时,我们没有意识到人为因素。

如果您确定异常不太可能发生(如果不是不可能的话),您应该创建自己的异常并将意外异常包装在其中。

例如:

private class UnlikelyException extends RuntimeException {
    public UnlikelyException (Exception e){
        super (e);
    }
}

然后用 try-catch 块包装您的代码并抛出您不必捕获的异常

try {
    // Your code
} catch  (Exception e) {
    throw new UnlikelyException(e);
}
于 2017-06-06T09:19:35.317 回答