[英]How does throw new exception inside a catch work?
我有一个片段如下:
try
{
//blah!!
}
catch(IOException e)
{
throw new RuntimeException(e);
}
我不明白上面的工作原理怎么样? 它会catch
IOException
吗?当它执行时会throw
RuntimeException
吗? 在那种情况下, IOException
没有任何意义吗? 一些例子会有所帮助。
你对某些假设是正确的,但你应该更深入一些。 在你的try
块中,假设你的一个方法抛出了这种异常IOException
。 因此,捕获将作为您处理这种特殊情况的方式。 基本上就是这个。 如果您只是使用RuntimeException抛出异常,但正如您所做的那样,在RuntimeException
包装IOException
,您根本不会丢失它。
正常使用是在更高级别处理您的例外。 这是一个关于异常处理的好教程,请检查: 异常处理的最佳实践
在此代码中,已检查的IOException将被有效取消选中。 通过将IOException传递给RuntimeException,您将2连在一起。
是的,你的理解是正确的。 在您希望显示特定于应用程序的异常而不是java提供的异常的情况下,这可能很有用(IOException可能不是理解这一点的完美案例)。
已检查的Exceptions
必须被捕获或声明为抛出。 RuntimeExceptions
没有,因此捕获和重新抛出RuntimeException
是避免必须声明的方法:
public void myMethod() throws IOException
throw new RuntimeException(e);
被调用的新异常被创建抛出,但原始异常被包装在其中。 所以堆栈跟踪看起来像这样:
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Some error.
at com...main(SomeClass.java:36)
Caused by: java.io.IOException: Some error.
因此调用堆栈的实际异常是RuntimeException
但原始IOException
作为根本原因保留在消息中。
你的理解是正确的。 如果抛出IOException
, catch
处理程序将捕获它,然后立即抛出自己的RuntimeException
。 这个异常可能会在程序的其他地方被捕获,在这种情况下,控制将在处理程序中获取,或者它将被取消并将终止当前线程。
考虑这里发生了什么的一种方法是: IOException
被检查异常,这意味着它必须被捕获。 如果它没有被捕获,那么程序将无法编译。 上面的代码说,每当它捕获IOException
,它都会抛出一个RuntimeException
,这是一个未经检查的异常。 如果程序员不想捕获它,则不必捕获此异常。 请注意,此RuntimeException
是使用捕获的IOException
作为参数构造的。 这意味着如果稍后捕获了RuntimeException
,那么抓住它的人可以注意到底层原因是IOException
并且可以相应地处理它。
希望这可以帮助!
不,RuntimeException有一些特别的东西。 如果要抛出RuntimeException,则不需要在方法签名中throws RuntimeException
。 这称为未经检查的异常。 此代码将IOException包装为RuntimeException并将其重新抛出给调用者,在大多数情况下,这是一种糟糕的方法。
未选中RuntimeException的所有子类,如IllegalArgumentException,NullPointerException等...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.