3

我有一个片段如下:

try
{
   //blah!!
} 
catch(IOException e)
{
   throw new RuntimeException(e);
}

我不明白上面的工作原理是什么?它catch会吗?什么IOException时候会?在那种情况下,将没有任何意义吧?一些例子会有所帮助。throwRuntimeExceptionIOException

4

6 回答 6

2

你对一些假设是正确的,但你应该更深入一点。在你的try块内,假设你的类的一个方法抛出了这种异常IOException。因此,catch 将作为您处理这种特殊情况的方式。基本上就是这样。如果您只是使用 RuntimeException 将您的异常丢弃,但正如您所做的那样,将您的异常包含IOExceptionRuntimeException您将不会丢失它。

一个正常的使用是在更高的层次上对待你的异常。这是一个关于异常处理的好教程,请查看:异常处理的最佳实践

于 2012-08-02T19:23:06.933 回答
1

在此代码中,已检查的 IOException 变为有效未检查。通过将 IOException 传递给 RuntimeException,您将 2 链接在一起。

于 2012-08-02T19:21:53.027 回答
1

是的,你的理解是正确的。这在您想要显示应用程序特定异常而不是 java 提供的异常的情况下可能很有用(IOException 可能不是理解这一点的完美案例)。

于 2012-08-02T19:21:56.997 回答
1

检查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.

因此,调用堆栈上的实际异常是 aRuntimeException但原始异常IOException作为根本原因保留在消息中。

于 2012-08-02T19:21:57.480 回答
1

你的理解是正确的。如果IOException抛出 an ,catch处理程序将捕获它,然后立即抛出它自己的RuntimeException。这个异常可能在程序的其他地方被捕获,在这种情况下,控制将在处理程序处获得,或者它将未被捕获并终止当前线程。

考虑这里发生的事情的一种方法如下 -IOException已检查异常,这意味着它必须被捕获。如果它没有被捕获,那么程序将无法编译。上面的代码说,只要它捕获到一个IOException,它就会抛出一个RuntimeException,这是一个未经检查的异常。如果程序员不想捕获此异常,则不必捕获它。请注意,这RuntimeException是使用 catchIOException作为参数构造的。这意味着如果RuntimeException后来被捕获,任何捕获它的人都可以注意到根本原因是 anIOException并且可以相应地处理它。

希望这可以帮助!

于 2012-08-02T19:22:13.313 回答
1

不,RuntimeException 有一些特别之处。当你想抛出一个 RuntimeException 时,你不需要throws RuntimeException方法签名中的 a。这称为未经检查的异常。此代码将 IOException 包装为 RuntimeException 并将其重新抛出给调用者,恕我直言,在大多数情况下,这是一种不好的方法。

RuntimeException 的所有子类都未选中,例如 IllegalArgumentException、NullPointerException 等...

于 2012-08-02T19:22:28.820 回答