在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
}
}
答案 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
声明。
以下是底线指南:如果可以合理地期望客户端从异常中恢复,请将其作为已检查的异常。如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常。
答案 1 :(得分:3)
在Java中,有两种Exceptions,Checked Exceptions和Unchecked Exceptions。
来自Exception文档:
类Exception和任何不属于其子类的子类 RuntimeException是已检查的异常。需要检查异常 如果可以的话,在方法或构造函数的throws子句中声明 通过执行方法或构造函数抛出并传播 在方法或构造函数边界之外。
来自RuntimeException文档:
RuntimeException是可以使用的那些异常的超类 在Java虚拟机的正常操作期间抛出。
RuntimeException及其子类是未经检查的异常。 未经检查的异常不需要在方法中声明 构造函数的throws子句,如果它们可以被执行抛出 方法或构造函数并在方法或方法之外传播 构造函数边界。
答案 2 :(得分:3)
你可以做三件事:
抛出RuntimeException
(或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
}
答案 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)
答案 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);
}