当必须始终捕获异常时,Java 程序怎么会崩溃?
How can Java programs crash when exceptions must always be caught?
如果这是一个愚蠢的问题,请原谅我,但据我所知,必须捕获并处理所有 Java 异常。
例如,这样的事情会产生编译器错误:
public String foo(Object o) {
if (o instanceof Boolean) {
throw new Exception();
}
return o.toString();
}
因为方法 foo()
没有添加 throws
子句。
然而,这个例子是可行的(除非方法 foo()
没有 throws
子句或者方法 bar()
没有包含 foo()
在 try/catch
块):
public String foo(Object o) throws Exception {
if (o instanceof Boolean) {
throw new Exception();
}
return o.toString();
}
public void bar(Object o) {
try {
String s = foo(o);
}
catch (Exception e) {
//...
}
//...
}
最后,有时 Java 程序有时仍会由于 未处理 异常而崩溃。
这是怎么发生的?
您不必处理所有 种异常。
从 java.lang.RuntimeException
or java.lang.Error
继承的异常是所谓的 未经检查的异常 可以被 try-catch 构造捕获,但它们不一定是.
如您在 java.lang.Error
的 API 文档中所见,它并未继承自 java.lang.Exception
。因此,它不会被您的 try-catch 块捕获 - 您只查找 java.lang.Exception
及其子类。
有些异常可以取消检查,这些被称为运行时异常。例如,IllegalArumentException
是未经检查的异常,因为它是 java.lang.RuntimeException
的后代。你可以阅读它 here.
如果这是一个愚蠢的问题,请原谅我,但据我所知,必须捕获并处理所有 Java 异常。 例如,这样的事情会产生编译器错误:
public String foo(Object o) {
if (o instanceof Boolean) {
throw new Exception();
}
return o.toString();
}
因为方法 foo()
没有添加 throws
子句。
然而,这个例子是可行的(除非方法 foo()
没有 throws
子句或者方法 bar()
没有包含 foo()
在 try/catch
块):
public String foo(Object o) throws Exception {
if (o instanceof Boolean) {
throw new Exception();
}
return o.toString();
}
public void bar(Object o) {
try {
String s = foo(o);
}
catch (Exception e) {
//...
}
//...
}
最后,有时 Java 程序有时仍会由于 未处理 异常而崩溃。
这是怎么发生的?
您不必处理所有 种异常。
从 java.lang.RuntimeException
or java.lang.Error
继承的异常是所谓的 未经检查的异常 可以被 try-catch 构造捕获,但它们不一定是.
如您在 java.lang.Error
的 API 文档中所见,它并未继承自 java.lang.Exception
。因此,它不会被您的 try-catch 块捕获 - 您只查找 java.lang.Exception
及其子类。
有些异常可以取消检查,这些被称为运行时异常。例如,IllegalArumentException
是未经检查的异常,因为它是 java.lang.RuntimeException
的后代。你可以阅读它 here.