异常的处理方法之:捕获
1.捕获,既对问题进行捕获并设定方法进行处理
定义: 在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。
try{
可能会出现异常的代码块
}catch(异变类型 异常变量){
异常的处理方案
}finally{
最终必然会执行的代码块}
异常捕获实例演示
public static void tryMethod(int[] arr) {
try {
int length = arr.length;
for(int i=0;i<length;i++) {
if(arr[i]>arr[i+1]) {
System.out.println(arr[i]);
}
}
}catch(NullPointerException e) {//对try中可能出现的空指针错误进行捕获并处理
//e.printStackTrace();//默认的打印错误信息及位置的方法
System.out.println("空指针错误,请检查对象");
}catch(ArrayIndexOutOfBoundsException e) {//对try中可能出现的下标越界错误进行捕获并处理
System.out.println("下标越界了");
}catch(Exception e) {//通常用于捕获未知的不确定的异常
System.out.println("未知错误");
}finally{//最终必然执行的代码
System.out.println("一定会执行");
}
}
要点一:捕获语法有多种书写形式,可以写成try{}catch{} 或者try{}finally{}的形式
要点二:可以捕获多个异常,完全取决于catch的数量,但是如果存在继承的关系,要把父级放在后面,如Exception
要点三:一个try后面虽然可以跟多个catch,但只会执行先匹配到的catch块。
要点四:当有多个异常的时候对与一直的异常建议针对性的捕获,对于未知的再使用Exception
要点五: 关于finally的执行问题
public static void main(String[] args){
int count = 6;
count = test(count);
System.out.println("count="+count);
}
public static int test(int count){
try{
count++;
int a = 3/0;
return count++;
}catch(ArithmeticException e){
e.printStackTrace();
}finally{
return ++count;
}
}
结果:
count = 8,且会输出错误代码
若将 int a = 3/0;这一错误代码行注释掉
count = 9,不会输出错误代码
可以发现,如果错误发生,那么try中错误代码行之前的代码会被正常执行,然后在错误发生的时候跳出,执行catch中的代码,最后执行finally;如果错误没有发生,那么try中的代码都会被执行,catch会被跳过,然后再执行finally
所以finally中的代码块是最终必然会执行的代码,通常用于io流关闭或数据库连接对象的关闭。
2.抛出
概念: 当错误发生是,方法创建异常对象并交付当前运行系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。
关键字:
- throw
关键词用在方法体内,表示抛出异常,由方法体内的语句进行处理,抛出一个异常实例。
- throws
在方法后面进行声明,表示可能要抛出异常,由该方法的调用者来处理。
声明的是这个方法会抛出这个类型的异常,使它的调用者知道要捕获这个异常。
声明名称为异常的类名或其父类的类名。若不知道异常的类名可以使用异常的总类名 Exception
代码实例
一般的无参抛出
public class ExceptionPractice {
public static void main(String[] args) throws ArithmeticException {
myMethod();
}
public static void method() throws ArithmeticException {
// 模拟异常处理
int a = 1/0;//此处会出现虚拟机自动识别的声明
// 使用throw和throws模拟出隐式的后台操作过程,隐式的过程用显式的展现,但是这个没有错误信息
throw new ArithmeticException();
}
使用有参的抛出来提供错误信息
public class ExceptionPractice {
public static void main(String[] args) throws ArithmeticException {
myMethod();
}
public static void method() throws ArithmeticException {
// 使用有参的构造,添加上错误信息
throw new ArithmeticException("/ by zero 除数不能为零");
}
要点一:不能抛出多个异常,当代码块抛出一个异常之后,程序就停止运行
那么如果存在多个异常呢
public class ExceptionPractice {
public static void main(String[] args) throws ArithmeticException, MyException {
myMethod();
}
public static void method() throws ArithmeticException, MyException {//若有多个异常声明,则使用英文逗号将异常类名隔开
boolean flag = true;
if(flag) {
throw new ArithmeticException("除数不能为0");
}else {
throw new NullPointerException("空指针异常");
}
}