是否可以忽略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 } } 

你可以尝试什么都不做:

 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中未经检查的exception扩展了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声明。

甲骨文提到的一句话 :

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

你可以做三件事:

  • 抛出RuntimeException (或者扩展RuntimeException东西,比如NullPointerExceptionIllegalArgumentException ,…),你不必捕获它们,因为它们是未经检查的exception。

  • 捕获exception并且不执行任何操作(不推荐):

     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 } 

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

  • exception是一个经过检查的exception,必须被捕获或抛出。
  • NullPointerException是一个RuntimeException ,(编译器不会强制它们在throws claus中声明)你可以忽略它,但它仍然可能在运行时发生,你的应用程序将崩溃。

来自Exception文档:

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

从RuntimeException文档:

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

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

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

 public RuntimeException hideThrow(Throwable e) { if (e == null) throw new NullPointerException("e"); this.hideThrow0(e); return null; } @SuppressWarnings("unchecked") private  void hideThrow0(Throwable e) throws GenericThrowable { throw (GenericThrowable) e; } 

你可以捕获exception,然后调用hideThrow ,抛出它而不需要编译器注意。 这是因为类型擦除。 在编译时, GenericThrowable表示RuntimeException因为这是我们传递的内容。 在运行时, GenericThrowable表示Throwable因为这是类型参数规范中的基本类型。

不,它会引发编译器错误。 作为一个经过检查的exception,您必须通过声明您的方法可能会抛出它来捕获它或传播它。 检查这个和这个 。

抛出RuntimeException或从RuntimeException派生的exception。 然后编译器不会强迫你捕获它。

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

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

或者,如果您的目标是包装确实声明其exception的现有方法

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

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

只是捕获一个exception,不要对它做任何事情,保持原样并捕获一般exception,以防你不知道特定的exception

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

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

即使您完全确定在任何情况下都不会失败,也不建议使用空的catch块来避免exception。 有时,我们不了解人为因素。

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

例如:

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

然后使用try-catch块包装你的代码并抛出exception,你不必抓住它

 try { // Your code } catch (Exception e) { throw new UnlikelyException(e); }