1. 基本介绍  448

异常处理就是当异常发生时,对异常处理的方式。

2. 异常处理方式

1) try- catch-finally

程序员在代码中捕获发生的异常,自行处理

2) throws

将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM

2.1 示意图  448

异常的处理方式_ci

异常的处理方式_异常处理_02

3. try-catch异常处理

1) Java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多t个ry.catch块.

异常的处理方式_异常处理_03

3.1 try-catch 方式处理异常-注意事项01  449

1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块

2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch.

3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码finally {}

代码在com.stulzl.trycatch_exception_detail.包中

TryCatchDetail
package com.stulzl.trycatch_exception_detail;

//try-catch 方式处理异常-注意事项  449
public class TryCatchDetail {
    public static void main(String[] args) {


        //快捷键ctrl+alt+t
        try {

            //String str = "中国";
            String str = "123";

            //解读
            //1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块
            //2. 如果异常没有发生,则顺序执行 try 的代码块,不会进入到 catch
            //3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finally
            int a = Integer.parseInt(str);

            System.out.println("数字:"+a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息="+e.getMessage());
        }finally{
            System.out.println("finally代码块被执行……");
        }
        System.out.println("程序继续进行……");
    }
}

3.2 try-catch 方式处理异常-注意事项02  449

4)可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception 在后,NullPointerException 在前),如果发生异常,只会匹配一个catch

代码在com.stulzl.trycatch_exception_detail02.包中

TryCatchDetail02
package com.stulzl.trycatch_exception_detail02;

//try-catch 方式处理异常-注意事项第四点  449
//4)可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,
// 子类异常在前,比如(Exception 在后,NullPointerException 在前),
// 如果发生异常,只会匹配一个catch
public class TryCatchDetail02 {
    public static void main(String[] args) {
        //解读
        //1.如果 try 代码块有可能有多个异常
        //2.可以使用多个 catch 分别捕获不同的异常,相应处理
        //3.要求子类异常写在前面,父类异常写在后面
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName());//NullPointerException
            int n1 = 10;
            int n2 = 0;
            int res = n1 / n2;//ArithmeticException
        } catch (NullPointerException e) {
            System.out.println("空指针异常=" + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("算术异常=" + e.getMessage());
        } catch (Exception e) {//父类异常,要写在后面
            System.out.println(e.getMessage());
        } finally {
        }

    }
}
class Person{
    private String name;
    public String getName(){
        return name;
    }
}

5)可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑

代码在com.stulzl.trycatch_exception_detail03.包中

TryCatchDetail03
package com.stulzl.trycatch_exception_detail03;

//try-catch 方式处理异常-注意事项第五点  449
public class TryCatchDetail03 {
    public static void main(String[] args) {
        //5)可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。
        try{
            int n1 = 10;
            int n2 = 0;
            System.out.println(n1/n2);
        }finally{
            System.out.println("执行了finally……");
        }
        System.out.println("代码继续执行……");//到这里程序直接崩掉了,因此不输出
    }
}

4. try-catch练习

4.1 练习1 判断输出   450

代码在com.stulzl.trycatch_exception_exercise01.包中

TryCatchExercise01
package com.stulzl.trycatch_exception_exercise01;

//try-catch练习 练习1 判断输出  450
public class TryCatchExercise01 {
}
class Exception01 {//类
    public static int method() {
        try {
            String[] names = new String[3];//String[]数组,数组元素为空
            if (names[1].equals("tom")) {//此句报NullPointerException异常,后续代码不执行
                System.out.println(names[1]);
            } else {
                names[3] = "hspedu";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {//捕获异常
            return 3;
        } finally { //必须执行
            return 4; //返回4,覆盖了之前返回的3
        }
    }
    public static void main(String[] args) {
        System.out.println(method()); //输出4
    }
}

4.2 练习2 判断输出  450

代码在com.stulzl.trycatch_exception_exercise02.包中

TryCatchExercise02
package com.stulzl.trycatch_exception_exercise02;

//try-catch练习 练习1 判断输出  450
public class TryCatchExercise02 {
}
class Exception02 {
    public static int method() {
        int i = 1;
        try {
            i++; //i = 2
            String[] names = new String[3];
            if (names[1].equals("tom")) {//空指针,抛出异常
                System.out.println(names[1]);
            } else {
                names[3] = "hspedu";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {//捕获异常
            return ++i; //i = 3
        } finally {//必须执行
            return ++i; //i = 4
        }
    }

    public static void main(String[] args) {
        System.out.println(method());//4
    }
}

异常的处理方式_异常处理_04

4.3 练习3 判断输出  450

代码在com.stulzl.trycatch_exception_exercise03.包中

TryCatchExercise03
package com.stulzl.trycatch_exception_exercise03;

public class TryCatchExercise03 {
}
class ExceptionExe01 {
    public static int method() {
        int i = 1;//i = 1
        try {
            i++;// i=2
            String[] names = new String[3];
            if (names[1].equals("tom")) { //空指针
                System.out.println(names[1]);
            } else {
                names[3] = "hspedu";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            // i = 3 => 保存临时变量 temp = 3;因finally语句必须执行,所以代码不会直接return走
            //要等finally执行完成,在继续return
            return ++i;
        } finally {//finally语句必须执行
            ++i; //i = 4
            System.out.println("i=" + i);// i = 4
        }
    }

    public static void main(String[] args) {
        System.out.println(method());// 3
    }
}

异常的处理方式_System_05

5. try-catch异常处理小结  450

1)如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句

2)如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally, 最后还需要执行finally里面的语句!