有没有一种方法来抛出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抛出代码并在那里处理
- 我收到一个IndentationError。 我该如何解决?
- 并发修改exception:添加到ArrayList
- java.lang.IllegalAccessError:尝试访问方法
- WCF ExceptionShielding错误ID不匹配与handlingInstanceId传递给处理程序
- 我怎样才能杀死一个线程? 不使用stop();
- 为什么这个断言在比较结构时抛出格式exception?
- 真实世界Haskell的哪些部分现在已经过时或被认为是不好的做法?
- 为什么返回NotImplemented而不是引发NotImplementedError
- asynchronousnode.js调用中的error handling