有没有一种方法来抛出exception,而不添加抛出声明?

我有以下情况。

我有一个Java类,从另一个基类inheritance,并重写一个方法。 基本方法不会抛出exception,因此没有throws ...声明。

现在我自己的方法应该可以抛出exception,但我可以select

  • 吞下例外
  • 添加一个抛出声明

这两个都不令人满意,因为第一个会默默地忽略exception(确定我可以执行一些日志logging),第二个会由于不同的方法头文件而产生编译器错误。

 public class ChildClass extends BaseClass { @Override public void SomeMethod() { throw new Exception("Something went wrong"); } } 

如果你真的想要,你可以抛出未经检查的exception而不必声明它们。 未经检查的exception扩展了RuntimeException 。 可扩展Error Throwable也是未选中的,但只能用于真正严重的问题(如无效的字节码)。

作为一个具体的例子,Java 8添加了UncheckedIOException来包装和重新抛出IOException

这是一个窍门:

 class Utils { @SuppressWarnings("unchecked") private static <T extends Throwable> void throwException(Throwable exception, Object dummy) throws T { throw (T) exception; } public static void throwException(Throwable exception) { Utils.<RuntimeException>throwException(exception, null); } } public class Test { public static void main(String[] args) { Utils.throwException(new Exception("This is an exception!")); } } 

第三种select是退出exception检查(就像标准API本身必须做的一样),并将检查的exception包装在RuntimeException

 throw new RuntimeException(originalException); 

您可能想要使用RuntimeException的更具体的子类。

我只是想添加一个替代答案,纯属作为一个供参考

是的,有一种方法可以通过使用sun.misc.Unsafe类来抛出一个检查的exception而不添加throws声明。 这在以下博客文章中进行了描述:

从方法抛出一个检查的exception而不声明它

示例代码:

 public void someMethod() { //throw a checked exception without adding a "throws" getUnsafe().throwException(new IOException()); } private Unsafe getUnsafe() { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); return (Unsafe) field.get(null); } catch (Exception e) { throw new RuntimeException(e); } } 

但是,这不被推荐。 如其他一些答案所述,最好包装一个未经检查的例外。

你为什么不抛出一个未经检查的exception? 这不必声明。

两种select是

  • 用一个未选中的exception包装。
  • 不要让编译器知道你正在抛出一个检查exception,例如Thread.currentThread()。stop(e);
  • 在Java 6中,如果exception是final ,那么您可以重新抛出该exception,并且编译器知道哪些检查了可能捕获的exception。
  • 在Java 7中,如果它是有效的,那么可以重新抛出一个exception,也就是说,不要在代码中改变它。

当你在你的代码中抛出一个检查exception并将其捕获到你的调用代码中时,后者会更有用,但是中间层不知道exception。

下面是一个截取检查exception并将其封装在一个未经检查的exception中的例子:

 public void someMethod() { try { doEvil(); } catch (IOException e) { throw new RuntimeException(e); } } 

是的,有一个为什么,但不build议你可以使用:

Java不安全的软件包

 getUnsafe().throwException(new IOException()); 

这个方法抛出检查exception,但是你的代码不会被强制捕获或重新抛出。 就像运行时exception一样。

你可以用覆盖你的方法的try-catch块捕获exception。 那么你不需要声明throws-语句。

您可以使用从RuntimeException或RuntimeException本身派生的任何exception

要么

使用try-block作为exception抛出代码并在那里处理