我对Java Exceptions有基本疑问
即,所有已检查的异常都从Exception
类延伸,未经检查的异常从RuntimeException
延伸。但运行时异常也从Exception
延伸。
但是为什么要使用已选中的try
传播catch
... Exceptions
阻止,而不是在未选中的例外中传播?
答案 0 :(得分:0)
通常,您应该为要处理的每种特定类型的异常添加不同的catch
块。如果您正在尝试处理(通过重新抛出)已检查的异常,那么您应该知道要重新抛出哪种类型的异常 - 只需添加catch
块来重新抛出每种异常类型。
答案 1 :(得分:0)
我想你在问,“我怎样才能抓住Exception
而不是RuntimeException
?
您可能不应该尝试这样做。您应尽可能捕获特定类型的异常。如果您需要处理所有错误,那么您应该抓住Exception
并抓住所有内容。*
您很少想要catch (NullPointerException)
,因为如果您知道自己可以拥有null
,那么您应该检查它。如果您的代码导致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。
答案 2 :(得分:0)
最简单的方法是:
try {
//do stuff
} catch(RuntimeException e) {
throw e;
} catch(SpecificCheckedException e) {
//handle
} catch(Exception e) {
//handle
}