是否可以忽略异常?

Run*_*oro 27 java exception-handling exception

在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
    }
}
Run Code Online (Sandbox Code Playgroud)

acd*_*ior 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 */ }
}
Run Code Online (Sandbox Code Playgroud)

请记住,在现实生活中,这是非常不明智的.这可以隐藏错误并让你整整一周都在寻找狗,而这个问题实际上是一只猫(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();
}
Run Code Online (Sandbox Code Playgroud)

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

从Oracle一句话吧:

这是底线指南:如果可以合理地期望客户端从异常中恢复,则将其作为已检查的异常.如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常.

  • @Craig哦,来吧,双关语将这个帖子提升到一个全新的水平:P (11认同)
  • 非常好的帖子.我建议的另一件事是至少在记录器中记录被忽略的异常. (6认同)
  • 我想这行可能更好地解释了预期的用法:"运行时异常代表了编程问题导致的问题,因此,不能合理地期望API客户端代码从它们中恢复或处理它们无论如何." 换句话说,`RuntimeException是一个骨头异常,来自程序员忘记解决某些情况或编程错误而且调用者给你的代码无法使用的数据或对象.它们是给调用者一个有用的错误信息的一种方式,让他们知道他们做错了什么. (5认同)
  • 这让人想知道他们的意思是"合理地预期会恢复".从程序本身的角度来看,如果文件丢失,可以做的不多,但检查了`FileNotFoundException`.程序可以做的最好的事情是通知用户(假设有一种方法可以输出给用户,这可能不是预定服务的情况或者你有什么).如果"通知用户错误"被认为是"合理的恢复",那么程序可以"合理地预期从字面上的任何异常中恢复",使得"RuntimeException"无用. (3认同)
  • 我想为这个可怕的双关语投票,但我不能让自己去做.+1为一个好的答案 (2认同)