1.背景
代码实例:
System.out.println(10/0)
//执行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero
数组下标越界:
int[] arr = {1,2,3};
System.out.println(arr[10]);
//执行结果:
//Exception in thread "main"java.lang.ArrayIndexOutOfBoundsException: 10
访问null对象
public class Test{
public int num = 10;
public static void main(String[] args){
Test t = null;
System.out.println(t.num);
}
}
//执行结果
Exception in thread "main" java.lang.NullPointerException
所谓异常指的就是程序在运行时出现错误时通知调用者的一种机制
2.异常的基本用法
捕获异常
try{
有可能出现异常的语句;
}[catch(异常类型 异常对象){
}...]
[finally{
异常的出口;
}]
注意事项:
try代码块中放的是可能出现异常的代码
catch代码块中放的是出现异常后的处理行为
finally代码块中的代码用于处理善后工作,会在最后执行
其中catch和finally都可以根据情况选择加或者不加
代码实例:
public class Examples {
public static void main(String[] args) {
int[] arr = {1,2,3};
try {
System.out.println("before");
System.out.println(arr[10]);
System.out.println("after");
}catch(ArrayIndexOutOfBoundsException e){
//打印出现异常的调用栈
e.printStackTrace();
}
System.out.println("after try catch");
}
}
一旦try中出现异常,那么try代码块中的程序就不会继续执行,而是交给catch中的代码来执行,catch执行完毕后会继续往下执行
3.catch
a)catch只能处理种类的异常
如果将上述代码修改为空指针异常的形式,则catch语句不能捕获到刚才的空指针异常,因为异常类型不匹配
b)catch可以有多个
一段代码可能会抛出多种不同的异常,不同的异常有不同的处理方式,因此可以搭配多个catch代码块
c)也可以用一个catch捕获所有异常
由于Exception类是所有异常类的父类,因此可以用这个类型表示捕捉所有异常
备注:catch进行类型匹配的时候,不光会匹配相同类型的异常对象,也会捕捉目标异常类型的子类对象
4.finally
finally表示最后的善后工作,例如释放资源
无论是否存在异常,finally中的代码一定都会执行到,保证最终一定会执行到Scanner中的close方法