展开全部
你应该这样去理解 “所有“ 的 Exception 类。62616964757a686964616fe59b9ee7ad9431333332623336
在 java 中 java.lang.Exception 是 java.lang.Throwable 的子类,而 java.lang.RuntimeException 也是 java.lang.Throwable 的子类。
因此,如果有一段代码,不管是会发生 Exception 还是 RuntimeException ,而你想一次性捕获所有错误的时候,这样写:
public static void main(String[] args) {
System.out.println("---------- 测试输出 1 ----------");
try{
String s = null;
//注:这一个会抛出 NullPointException,即 RuntimeException的子类。
s = s.substring(0);
}catch(Throwable ex) {
ex.printStackTrace();
}
System.out.println("---------- 测试输出 2 ----------");
try{
String s = "123";
//注:这一个会抛出 IndexOutOfBoundsException,即 RuntimeException 的子类。
int i = s.indexOf(200);
}catch(Throwable ex) {
ex.printStackTrace();
}
System.out.println("---------- 测试输出 3 ----------");
}
你在上面的代码里面可以看到,即使是发生了 RuntimeException ,但是使用了 Throwable 也可以捕获到,而且你不用关心具体是什么原因出错了,只要有错误,用 Throwable 都可捕获到。
如果不使用 Throwable ,又是一个什么情况呢,这个时候,你就需要在程序中针对某一个 Exception 或 RuntimeException 来写 catch 了:public static void main(String[] args) {
System.out.println("---------- 测试输出 4 ----------");
try{
String s = null;
//注:这一个会抛出 NullPointException,即 RuntimeException 的子类。
s = s.substring(0);
}catch(NullPointException ex) {
ex.printStackTrace();
}
System.out.println("---------- 测试输出 5 ----------");
try{
String s = "123";
//注:这一个会抛出 IndexOutOfBoundsException,即 RuntimeException 的子类。
int i = s.indexOf(200);
}catch(IndexOutOfBoundsException ex) {
ex.printStackTrace();
}
System.out.println("---------- 测试输出 6 ----------");
}
但是,其实所有 RuntimeException 及其子类都不需要在程序中显式调用的,如果不进行显式调用,则表明你不需要理会错误,当有任何错误发生时,让程序自动终止:
public static void main(String[] args) {
System.out.println("---------- 测试输出 7 ----------");
String s = null;
//注:这一个会抛出 NullPointException,即 RuntimeException 的子类。
s = s.substring(0);
System.out.println("---------- 测试输出 8 ----------");
String s = "123";
//注:这一个会抛出 IndexOutOfBoundsException,即 RuntimeException 的子类。
int i = s.indexOf(200);
System.out.println("---------- 测试输出 9 ----------");}
这个时候,在上面代码中,因为没有进行 catch ,所以,第 2 句 “测试输出 8” 就不会执行到了。