是否可以忽略异常?

时间:2013-05-24 02:30:35

标签: java exception exception-handling

在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
    }
}

10 个答案:

答案 0 :(得分:54)

您可以尝试对此无动于衷:

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的建议,记录是最好的做法。)

Unchecked exceptions in 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声明。

a word from Oracle关于它:

  

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

答案 1 :(得分:3)

在Java中,有两种Exceptions,Checked Exceptions和Unchecked Exceptions。

  • Exception是一个经过检查的异常,必须抓住或抛出。
  • NullPointerExceptionRuntimeException,(编译器不会强制它们在throws claus中声明)你可以忽略它,但它仍然可能出现在运行时< / strong>,您的申请将崩溃。

来自Exception文档:

  

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

来自RuntimeException文档:

  

RuntimeException是可以使用的那些异常的超类   在Java虚拟机的正常操作期间抛出。

     

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

答案 2 :(得分:3)

你可以做三件事:

  • 抛出RuntimeException(或RuntimeException扩展的内容,如NullPointerExceptionIllegalArgumentException,...),您无需抓住这些内容因为它们是未经检查的例外。

  • 抓住异常并且什么都不做(不推荐):

    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
    }
    

答案 3 :(得分:3)

您可以在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,因为这是类型参数规范中的基本类型。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

抛出RuntimeException或从RuntimeException派生的例外。然后编译器不会强迫你抓住它。

答案 7 :(得分:1)

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

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

或者你的目标是包装一个确实声明其异常的现有方法

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

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

答案 8 :(得分:1)

只是抓住一个异常并且不对它做任何事情,保持原样并捕获一般异常,以防你不知道具体的异常

try{
//Your logic goes here
}
catch(Exception e)//Exception is generic
{
//do nothing
}

答案 9 :(得分: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);
}