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时,全都在反编译的时候消失了)
}