我有一个片段如下:
try
{
//blah!!
}
catch(IOException e)
{
throw new RuntimeException(e);
}
我不明白上面的工作原理如何?它会catch
IOException
吗?什么时候throw
RuntimeException
?在这种情况下,IOException
没有任何意义吗?一些例子会有所帮助。
答案 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)
您的理解是正确的。如果抛出IOException
,catch
处理程序将捕获它,然后立即抛出自己的RuntimeException
。这个异常可能会在程序的其他地方被捕获,在这种情况下,控制将在处理程序中获取,或者它将被取消并将终止当前线程。
考虑这里发生了什么的一种方法是:IOException
被检查异常,这意味着它必须被捕获。如果它没有被捕获,那么程序将无法编译。上面的代码表示只要它捕获IOException
,就会抛出RuntimeException
,这是一个未经检查的异常。如果程序员不想捕获它,则不必捕获此异常。请注意,此RuntimeException
是使用捕获的IOException
作为参数构造的。这意味着如果RuntimeException
后来被捕获,那么抓住它的人可以注意到潜在原因是IOException
并且可以相应地处理它。
希望这有帮助!
答案 5 :(得分:1)
没有。 RuntimeException有一些特殊之处。如果要抛出RuntimeException,则方法签名中不需要throws RuntimeException
。这称为未经检查的异常。此代码将IOException包装成RuntimeException并将其重新呈现给调用者,在大多数情况下,这是一种糟糕的方法。
取消选中RuntimeException的所有子类,例如IllegalArgumentException,NullPointerException等......