我对 Java Exceptions 有基本的怀疑
即,所有已检查的异常都从Exception
类扩展,未经检查的异常从RuntimeException
. 但运行时异常也从Exception
.
但是为什么要传播try
...catch
带有已检查Exceptions
但不在未检查异常中的块?
我想你是在问,“我怎么能抓住Exception
但不能RuntimeException
?
您可能不应该尝试这样做。您应该尽可能捕获特定类型的异常。如果您需要处理所有错误,那么您应该捕获Exception
并捕获所有错误。*
您很少愿意这样做,catch (NullPointerException)
因为如果您知道可以拥有 anull
那么您应该检查它。如果您的代码导致NullPointerException
或者ArrayOutOfBoundsException
您应该修复代码,以便它不再抛出这些。
此代码应向您展示如何执行您所要求的操作:
public static void throwSomething(Exception throwMe)
{
try {
throw throwMe;
}
catch(Exception ex) {
// Check if the object is a RuntimeException
if(ex instanceof RuntimeException) {
// Throw the same object again.
// Cast to RuntimeException so the compiler will not
// require "throws Exception" on this method.
throw (RuntimeException) ex;
}
System.out.println("Caught an instance of a " +
ex.getClass().toString());
}
}
*实际上,catch(Throwable)
将捕获包括Error
s 在内的所有内容。
通常,您应该catch
为要处理的每种特定类型的异常添加不同的块。如果您正在尝试处理(通过重新抛出)已检查的异常,那么您应该知道要重新抛出哪种类型的异常——只需添加一个catch
块来重新抛出每种异常类型。
最简单的方法是这样的:
try {
//do stuff
} catch(RuntimeException e) {
throw e;
} catch(SpecificCheckedException e) {
//handle
} catch(Exception e) {
//handle
}