我有一个片段如下:
try
{
//blah!!
}
catch(IOException e)
{
throw new RuntimeException(e);
}
我不明白上面的工作原理是什么?它catch
会吗?什么IOException
时候会?在那种情况下,将没有任何意义吧?一些例子会有所帮助。throw
RuntimeException
IOException
我有一个片段如下:
try
{
//blah!!
}
catch(IOException e)
{
throw new RuntimeException(e);
}
我不明白上面的工作原理是什么?它catch
会吗?什么IOException
时候会?在那种情况下,将没有任何意义吧?一些例子会有所帮助。throw
RuntimeException
IOException
你对一些假设是正确的,但你应该更深入一点。在你的try
块内,假设你的类的一个方法抛出了这种异常IOException
。因此,catch 将作为您处理这种特殊情况的方式。基本上就是这样。如果您只是使用 RuntimeException 将您的异常丢弃,但正如您所做的那样,将您的异常包含IOException
在RuntimeException
您将不会丢失它。
一个正常的使用是在更高的层次上对待你的异常。这是一个关于异常处理的好教程,请查看:异常处理的最佳实践
在此代码中,已检查的 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.
因此,调用堆栈上的实际异常是 aRuntimeException
但原始异常IOException
作为根本原因保留在消息中。
你的理解是正确的。如果IOException
抛出 an ,catch
处理程序将捕获它,然后立即抛出它自己的RuntimeException
。这个异常可能在程序的其他地方被捕获,在这种情况下,控制将在处理程序处获得,或者它将未被捕获并终止当前线程。
考虑这里发生的事情的一种方法如下 -IOException
已检查异常,这意味着它必须被捕获。如果它没有被捕获,那么程序将无法编译。上面的代码说,只要它捕获到一个IOException
,它就会抛出一个RuntimeException
,这是一个未经检查的异常。如果程序员不想捕获此异常,则不必捕获它。请注意,这RuntimeException
是使用 catchIOException
作为参数构造的。这意味着如果RuntimeException
后来被捕获,任何捕获它的人都可以注意到根本原因是 anIOException
并且可以相应地处理它。
希望这可以帮助!
不,RuntimeException 有一些特别之处。当你想抛出一个 RuntimeException 时,你不需要throws RuntimeException
方法签名中的 a。这称为未经检查的异常。此代码将 IOException 包装为 RuntimeException 并将其重新抛出给调用者,恕我直言,在大多数情况下,这是一种不好的方法。
RuntimeException 的所有子类都未选中,例如 IllegalArgumentException、NullPointerException 等...