try-catch

主讲人:王少华  QQ群号:483773664

学习目标

学会使用try-catch处理异常

一、什么是异常

异常是指在程序的运行过程中所发生的不正常事件,它会中断正在运行的程序。


二、什么是异常处理

异常处理机制就像我们时可能会遇到的意外情况,预先想好的一些处理办法。


在程序执行代码的时候,万一发生的异常,程序会按照预定的处理办法对异常进行处理,异常处理完毕之后,程序继续运行。


Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw和throws

三、使用try-catch捕获异常

上一节的示例,业务代码和异常处理代码混在一起,我们希望有一个这样的"if块“,可以表示所有错误情况,让程序可以一次处理所有错误。

出于这种考虑,我们们试较图把”处理异常代码“和”处理业务代码“分开。

Java提供的机制:把业务实现代码放在try块中,所有异常处理逻辑入在catch块中进行处理。

(一)使用try-catch优化上一节示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
            System.out.print("请输入被除数:");       
        try {
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(String.format("%d / %d = %d",
                    num1, num2, num1/ num2));
            System.out.println("感谢使用本程序!");
        } catch (Exception e) {
            System.err.println("出现错误:被除数和除数必须是整数," +
                    "除数不能为零。");
            e.printStackTrace();
        }
    }
}

(二)try-catch执行流程

1、不发生异常

如果try块中所有语句正常执行,不发生异常,那么catch块中的所有语句都不会被执行。如下所示


2、发生异常,被捕获了

如果try语句块在执行过程中遇到异常,并且这个异常与catch中声明的异常类型相匹配,那么在try块中其余剩下的代码都将被忽略,而相应的catch块将会被执行。

匹配是指catch所处理的异常类型与所生成的异常类型完全一致或是它的父类。


3、发生异常,未匹配

如果try语句块在执行过程中遇到异常,而抛出的异常在catch块里面没有被声明,那么程序立刻退出。

四、try-catch扩展:一个try跟多个catch块

对上面的示例进行改造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Test2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
            System.out.print("请输入被除数:");      
        try {
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(String.format("%d / %d = %d",
                    num1, num2, num1/ num2));
            System.out.println("感谢使用本程序!");
        }catch(InputMismatchException ie){
            System.out.println("输入的类型不匹配");
            ie.printStackTrace();
        }catch (ArithmeticException e) {
            System.err.println("除数不能为零");
            e.printStackTrace();
        }catch (Exception e) {
            System.err.println("出现错误:被除数和除数必须是整数," +
                    "除数不能为零。");
            e.printStackTrace();
        }
    }
}

五、总结try-catch流程

如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象(下节课讲解Java中的异常对象),该异常对象被提交给Java运行环境,这个过程被称为抛出异常。

当Java运行时环境收到异常对象时,会寻找能处理该对象的catch块,如果找到合适的catch块并把该异常交给该catch块处理,那这个过程被称为捕获异常;如果Java运行时环境找不到捕获异常的catch块,则运行时环境终止,Java程序也将退出。

对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。

在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要刚在最后一个catch里面。