繁体   English   中英

如何在catch工作中抛出新异常?

[英]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作为根本原因保留在消息中。

你的理解是正确的。 如果抛出IOExceptioncatch处理程序将捕获它,然后立即抛出自己的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM