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

时间:2012-08-02 19:18:40

标签: java exception-handling try-catch

我有一个片段如下:

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

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

6 个答案:

答案 0 :(得分:2)

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

正常使用是在更高级别处理您的例外。这是一个关于异常处理的好教程,请查看:Best Practices for Exception Handling

答案 1 :(得分:1)

在此代码中,已检查的IOException将被有效取消选中。通过将IOException传递给RuntimeException,您将2连在一起。

答案 2 :(得分:1)

是的,你的理解是正确的。如果您希望显示特定于应用程序的异常而不是java提供的异常(IOException可能不是理解这一点的完美案例),这可能很有用。

答案 3 :(得分: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.

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

答案 4 :(得分:1)

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

考虑这里发生了什么的一种方法是:IOException被检查异常,这意味着它必须被捕获。如果它没有被捕获,那么程序将无法编译。上面的代码表示只要它捕获IOException,就会抛出RuntimeException,这是一个未经检查的异常。如果程序员不想捕获它,则不必捕获此异常。请注意,此RuntimeException是使用捕获的IOException作为参数构造的。这意味着如果RuntimeException后来被捕获,那么抓住它的人可以注意到潜在原因是IOException并且可以相应地处理它。

希望这有帮助!

答案 5 :(得分:1)

没有。 RuntimeException有一些特殊之处。如果要抛出RuntimeException,则方法签名中不需要throws RuntimeException。这称为未经检查的异常。此代码将IOException包装成RuntimeException并将其重新呈现给调用者,在大多数情况下,这是一种糟糕的方法。

取消选中RuntimeException的所有子类,例如IllegalArgumentException,NullPointerException等......