Java讲课笔记18:异常处理

网友投稿 805 2022-05-29

文章目录

零、本讲学习目标

1、理解什么是异常

2、熟悉异常的类型

3、掌握try…catch和finally异常处理

4、掌握throws关键字

一、什么是异常

1、程序异常及解决方法

(1)生活中的异常

(2)程序中的异常

(3)程序异常解决方法

2、Java异常体系结构

(1)Exception —— 异常

(2)Error —— 错误

3、Throwable类中的常用方法

二、异常的类型

1、编译时异常

(1)编译时异常定义

(2)编译时异常类汇总

(3)编译时异常的特点

(4)处理编译时异常的方式

2、运行时异常

(1)运行时异常定义

(2)运行时异常类汇总

Java讲课笔记18:异常处理

(3)运行时异常的特点

(4)运行时异常错误分析

(5)运行时异常示例

a. 数组下标越界异常

b. 空指针异常

c. 算术异常

d. 类型转换异常

e. 数字格式异常

三、异常捕获

1、异常捕获try…catch语句

(1)语法格式

(2)案例演示

(3)简要说明

2、异常捕获try…catch...finally语句

(1)语法格式

(2)案例演示

(3)简要说明

3、捕获多个异常

(1)错误:大异常在小异常之前

(2)正确:小异常在大异常之前

四、抛出异常

1、为什么要抛出异常

2、使用throws关键字抛出异常

(1)语法格式

(2)案例演示

(3)简要说明

五、课后作业

任务、给排序静态方法抛出异常

零、本讲学习目标

1、理解什么是异常

2、熟悉异常的类型

3、掌握try…catch和finally异常处理

4、掌握throws关键字

一、什么是异常

1、程序异常及解决方法

(1)生活中的异常

在学习、工作与生活中,我们也经常会遇到一些非正常情况,例如电脑蓝屏、死机,感冒发烧,车票丢失等等。

(2)程序中的异常

在程序运行的过程中,也会发生这种非正常状况,例如程序运行时磁盘空间不足、网络连接中断、被加载的类不存在等。

在《Java讲课笔记08:数组》里,我们遇到过数组下标越界异常:

异常提示信息非常明确,指出程序中出现了数组下标越界异常。由于程序中第11行给不存在的数组元素scores[4]赋值,导致错误。这个异常发生后,程序会立即结束,无法继续向下执行,比如第12行的输出语句就没有被执行。

(3)程序异常解决方法

针对程序中的非正常情况,Java语言中引入了异常,以异常类的形式对这些非正常情况进行封装,并通过异常处理机制对程序运行时发生的各种问题进行处理。

2、Java异常体系结构

Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。

(1)Exception —— 异常

Exception称为异常类,它表示程序本身可以处理的错误。在Java程序开发中进行的异常处理,都是针对Exception类及其子类的。

(2)Error —— 错误

Error称为错误,表示Java运行时产生的系统内部错误或资源耗尽的错误,是比较严重的,仅靠修改程序本身是不能恢复执行的,例如系统崩溃,虚拟机错误等。

3、Throwable类中的常用方法

利用IntelliJ IDEA查看Throwable类的结构

Throwable类中的常用方法

二、异常的类型

1、编译时异常

(1)编译时异常定义

在程序编译时期产生的异常,而这些异常必须要进行处理,也称为checked异常。

(2)编译时异常类汇总

在Exception的子类中,除了RuntimeException类及其子类外,其他子类都是编译时异常。比如IOException(EOFException、FileNotFoundException)、SQLException。

(3)编译时异常的特点

在程序编写过程中,Java编译器就会对编写的代码进行检查,如果出现比较明显的异常就必须对异常进行处理,否则程序无法通过编译。

(4)处理编译时异常的方式

使用try…catch语句对异常进行捕获处理

使用throws关键字声明抛出异常,让调用者处理

2、运行时异常

(1)运行时异常定义

这种异常即使不编写异常处理代码,依然可以通过编译,也称为unchecked异常。

(2)运行时异常类汇总

RuntimeException类及其子类都是运行时异常。

Java常见运行时异常类

(3)运行时异常的特点

运行时异常是在程序运行时由Java虚拟机自动进行捕获处理的,即使没有使用try…catch语句捕获或使用throws关键字声明抛出,程序也能编译通过,只是在运行过程中可能报错。

(4)运行时异常错误分析

运行时异常一般是由于程序中的逻辑错误引起的,在程序运行时无法恢复。

(5)运行时异常示例

三、异常捕获

当程序发生异常时,会立即终止,无法继续向下执行。为了保证程序能够有效的执行,Java中提供了一种对异常进行处理的方式——异常捕获。

1、异常捕获try…catch语句

(1)语法格式

try { // 可能发生异常的语句 } catch(Exception类或其子类 e){ // 对捕获的异常进行相应处理 }

1

2

3

4

5

(2)案例演示

创建Example1806

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

26

27

28

29

30

31

32

33

34

35

36

37

38

运行程序,查看结果

如果除数n不为0,程序运行正常,输出除法的结果:

如果除数n为0,程序抛出异常后终止,无法输出除法的结果:

修改divide()方法,对可能导致异常的代码进行异常处理

public static int divide(int m, int n) { try { int q = m / n; return q; } catch (Exception e) { // 捕获异常进行处理 System.err.println("异常信息:" + e.getMessage()); } return Integer.MIN_VALUE; // 程序异常时返回最小整数 }

1

2

3

4

5

6

7

8

9

修改main()方法,对调用方法返回结果进行判断

public static void main(String[] args) { int m, n, q; Scanner sc = new Scanner(System.in); System.out.print("m = "); m = sc.nextInt(); System.out.print("n = "); n = sc.nextInt(); q = divide(m, n); if (q == Integer.MIN_VALUE) { System.err.println("程序发生了异常!"); } else { System.out.println(m + " ÷ " + n + " = " + q); } System.out.println("程序到此执行完毕!"); }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

运行程序,查看结果

虽然程序发生了异常,但是程序的最后一条语句也是执行了的。

(3)简要说明

在定义的整数除法运算方法divide()中对可能发生异常的代码用try…catch语句进行了捕获处理。在try{}代码块中发生除0异常,程序会转而执行catch(){}中的代码,通过调用Exception对象e的getMessage()方法,即可返回异常信息:“/ by zero”。catch(){}代码块对异常处理完毕后,程序仍会向下执行,执行return Integer.MIN_VALUE;,而不会因为异常而终止运行。

需要注意的是,在try{}代码块中,发生异常语句后面的代码是不会被执行的,比如发生异常的语句“int q = m / n;”后面的返回语句“return q;”就没有执行。

在程序中,如果希望有些语句无论程序是否发生异常都要执行,这时就可以在try…catch语句后,加一个finally{}代码块。

2、异常捕获try…catch…finally语句

(1)语法格式

try { // 可能发生异常的语句 } catch(Exception类或其子类 e){ // 对捕获的异常进行相应处理 } finally { // 无论是否发生异常,此代码块代码总会执行 }

1

2

3

4

5

6

7

(2)案例演示

修改Example1806里的divide()方法,添加finally{}代码块

运行程序,查看结果

(3)简要说明

由此可见,无论程序是否发生了异常,finally{}代码块里的语句都会被执行。正是由于这种特殊性,在程序设计时,经常会在try…catch后面使用finally{}代码块来完成善后工作,比如释放系统资源、关闭数据库连接、关闭线程池等。

如果在try…catch中执行了System.exit(0)语句,finally{}中的代码就不会被执行。因为System.exit(0)语句表示退出当前的Java虚拟机,既然Java虚拟机都停止了,当然任何代码都不能再执行了。

由于在catch{}代码块里添加了一条System.exit(0)语句,于是finally{}代码块里的语句就没有被执行,输出信息里就没有“无论程序是否异常,都会执行~”了。

3、捕获多个异常

如果有多个异常要处理,一般是先处理小异常,再依次处理较大的异常。

(1)错误:大异常在小异常之前

鼠标移到小异常上面,系统会提示“该异常已被捕获”。

(2)正确:小异常在大异常之前

四、抛出异常

1、为什么要抛出异常

一般在程序开发中,开发者通常会意识到程序可能出现的问题,可以直接通过try…catch对异常进行捕获处理。但有些时候,方法中代码是否会出现异常,开发者并不明确或者并不急于处理,为此,Java允许将这种异常从当前方法中抛出,然后让后续的调用者在使用时再进行异常处理。

2、使用throws关键字抛出异常

在Java中,将异常抛出需要使用throws关键字来实现,该关键字用在会抛出异常的方法名称后,同时支持一次性抛出多种类型的异常。

(1)语法格式

[修饰符] 返回值类型 方法名([参数类型 参数名1...]) throws 异常类1, 异常类2, ... { // 方法体... }

1

2

3

throws关键字需要写在方法声明的后面,并在后面需要声明方法中发生异常的类型。

(2)案例演示

创建Example1807

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

26

27

28

29

30

31

但是,程序编译报错,有未被处理的异常:

将鼠标移到红色波浪线上,按组合键+,系统给出两种快速解决方案:

解决方法一:Surround with 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

26

27

28

29

30

31

32

33

34

35

运行程序,结果如下:

解决方法二:Add exception to method signature 表示在方法上继续使用throws关键字抛出异常

此时运行程序,查看结果:

虽然在主方法上添加了throws关键字抛出异常,编译确实能通过,但是程序发生了异常,终究是需要进行处理的,既然没有处理,那么最终就会导致程序终止运行。

(3)简要说明

当调用者在调用有抛出异常的方法时,除了可以在调用程序中直接进行try…catch异常处理外,也可以根据提示使用throws关键字继续将异常抛出,这样程序也能编译通过。但是,程序发生了异常,终究是需要进行处理的,如果没有被处理,程序就会非正常终止。

五、课后作业

任务、给排序静态方法抛出异常

编写排序静态方法:public static void sort(int[] arr) throws Exception {}

主方法:静态初始化数组arr,输出全部数组元素,调用sort(arr),输出全部数组元素

对可能出错的代码进行异常处理(传入的arr参数是null时就要抛出异常)

当传入sort()方法的数组参数arr不是null时,结果如下:

当传入sort()方法的数组参数arr是null时,结果如下:

Java 数据结构

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何搭建高可用MongoDB集群(分片)【绽放吧!数据库】
下一篇:【云驻共创】华为数字化转型实践
相关文章