1.try catch 捕获时的注意事项:支持多catch语句捕获异常;先将子类的异常捕获掉,然后再去捕获父类的异常;即多catch语句中,不能首先catch(Exception e ),编译器会提示剩余的异常不能被捕获到。
2.throw,throws主要区别:throws主要时在方法的签名后使用throws,这个方式会简化代码,并且对于某些数据库的事务问题,我们有时希望一部分全都做或者全部做,那么就不向对异常进行处理就是用throws来抛出异常。(用在方法上)
throw 需要抛出一个对象,所以需要new,并且throw可以在语句的内容中使用。(用在方法内部)
3.finally关键字:不同于final关键字,这个final表示始终,finally表示结尾。final用于定义一个常量类型:如静态常量,final所修饰的方法不能被重写,修饰类那么类不能被继承,修饰引用,那么地址值不能变,如果是基础数据类型那么基础数据类型的值不能被改变 。
finally关键字:这个关键字主要是搭配try catch使用,表示无论是否发生异常,都会执行finally后面的语句、这个语句经常在IO流中使用,比如打开的文件后的关闭。
try{
}
catch(){
}
finally(){ }
注意事项try catch return ,finally这几个关键字的问题所在:
1.1try语句块内发生异常时,会被catch所捕获的,如果捕获到就会执行catch语句中的代码,没捕获到就不会执行。
1.2finally语句是一定会被执行的,他不论前面是否会被return掉;
1.3当try,finally语句中都存在return语句时,我们查看字节码文件反编译后的class文件时就可以发现,finally代码块之前的return 全部都消失了,只保留finally代码块中文件。
package com.ydlclass.CustomizationException;
import java.util.Scanner;
public class Client {
public static int fun(){
int i = 1;
try{
i++;
System.out.println(i);
return i;
} catch (Exception e){
i += 10;
System.out.println(i);
return i;
} finally {
i = 100;
System.out.println(i);
}
}
public static int fun2(){
int i = 1;
try{
i++;
System.out.println(i);
return i;
} catch (Exception e){
i += 10;
System.out.println(i);
return i;
} finally {
i = 100;
System.out.println(i);
return 200;
}
}
public static void main(String[] args) {
int i = 1;
// //test1
// try {
// i++;
// System.out.println(i);//try语句也必备执行
// } catch (Exception e){//catch没有捕获到异常
// i += 10;
// System.out.println(i);
// } finally {//finally必被执行
// i = 100;
// System.out.println(i);
// }
// //结果为:2 100
// int fun = fun();
// System.out.println(fun);
int i1 = fun2();
System.out.println(i1);
}
//执行的结果为 2 100 2,说明执行的顺序还是十分有好的
//第三次的执行结果为2 100 200
//执行的顺序为try,try中的return(前提时final中没有return语句),finnal语句,finnal语句中的return语句(额外的:当前面的语句中存在return时,全都在反编译的时候消失了)
}