public class ExceptionTest01 {
public static void main(String[] args) {
int a = 10;
int b = 2;
if(b == 0){
System.out.println("除数不能为0");
return;
}
int c = a / b;
System.out.println(a + "/" + b + "=" + c);
String s = null;
s.toString(); // 这里会发生空指针异常,程序执行到这里JVM就会在底层new一个NullPointerException类型的实例。
//String s2 = null;
//s2.toString(); // 在底层new一个NullPointerException类型的实例。
}
}
第一步:编写异常类继承Exception/RuntimeException
第二步:提供一个无参数构造方法,再提供一个带String msg参数的构造方法,在构造方法中调用父类的构造方法 ,用super(String)
代码演示:

异常在处理的整个过程中应该是:声明和捕捉联合使用。
什么时候捕捉?什么时候声明?
如果一个异常发生后希望调用者来处理的,使用声明异常(俗话说:交给上级处理)
public void m() throws AException, BException... {}如果AException 和 BException都继承了XException,那么也可以这样写:
public void m() throws XException{}调用者在调用m()方法时,编译器会检测到该方法上用throws声明了异常,表示可能会抛出异常,编译器会继续检测该异常是否为编译时异常,如果为编译时异常则必须在编译阶段进行处理,如果不处理编译器就会报错。
如果所有位置都采用throws,包括main方法的处理态度也是throws,如果运行时出现了异常,最终异常是抛给了main方法的调用者(JVM),JVM则会终止程序的执行。因此为了保证程序在出现异常后不被中断,至少main方法不要再使用throws进行声明了。
发生异常后,在发生异常的位置上,往下的代码是不会执行的,除非进行了异常的捕捉。
如果一个异常发生后,不需要调用者知道,也不需要调用者来处理,选择使用捕捉方式处理。
try{
// 尝试执行可能会出现异常的代码
// try块中的代码如果执行出现异常,出现异常的位置往下的代码是不会执行的,直接进入catch块执行
}catch(AException e){
// 如果捕捉到AException类型的异常,在这里处理
}catch(BException e){
// 如果捕捉到BException类型的异常,在这里处理
}catch(XException e){
// 如果捕捉到XException类型的异常,在这里处理
}// 当try..catch..将所有发生的异常捕捉后,这里的代码是会继续往下执行的。catch可以写多个。并且遵循自上而下,从小到大。
Java7新特性:catch后面小括号中可以编写多个异常,使用运算符“|”隔开。
获取异常的简单描述信息:
打印异常堆栈信息:
要会看异常的堆栈信息:
finally语句块中的代码是一定会执行的。
finally语句块不能单独使用,至少需要配合try语句块一起使用:
通常在finally语句块中完成资源的释放
final、finally、finalize分别是什么?
代码演示:

方法重写之后,不能比父类方法抛出更多的异常,可以更少。
