【基础训练 1】异常捕获处理。

【目标】理解什么是异常,异常处理机制的执行特点。

(1) 设有一个数组存储一批英文单词,从键盘输入一个数 n,输出数组中元素序号为 n 的单词。

【参考程序】程序文件名为 ExceptionTest.java

运行该程序,正常输入 0,1,2,3 检查输出结果。

输入 4,5 或-1 ,观察会产生什么异常,因为什么原因产生?

输入 a, 观察会产生异常,因为什么原因产生?

异常检测 java 算法 java异常处理实验_抛出异常

当输入4时:

异常检测 java 算法 java异常处理实验_自定义异常_02

当输入a时:

异常检测 java 算法 java异常处理实验_数组_03

出现以上原因是数组索引越界,或者输入的不是数字。

(2)为了控制异常的报错处理,利用 try…catch 进行异常处理。

异常检测 java 算法 java异常处理实验_自定义异常_04

当访问出界或没有输入整数时:

异常检测 java 算法 java异常处理实验_数组_05

异常检测 java 算法 java异常处理实验_抛出异常_06

(3)将以上两个 catch 部分内容删除,改用一个 catch,其中,捕获的异常为 Exception

类,观察程序的运行变化。

catch (Exception e) {

System.out.println("出现异常");

}

体会异常层次的继承关系:

异常检测 java 算法 java异常处理实验_自定义异常_07

异常检测 java 算法 java异常处理实验_异常检测 java 算法_08

(4)在程序的异常处理代码中,加入 finally 部分,检查其代码在什么情况下将执行。

finally {

System.out.println("执行了 finally 块");

}

异常检测 java 算法 java异常处理实验_数组_09

异常检测 java 算法 java异常处理实验_抛出异常_10

正常情形和异常情形均会执行 finally 块的内容吗?

经测试,正常情形和异常情形均会执行 finally 块的内容。

(5)异常排序问题。将前面的 3 个 catch 均包含在程序中,如何排序,能将第 3 条的那个 catch 放在首位吗?为什么?

异常检测 java 算法 java异常处理实验_数组_11

异常检测 java 算法 java异常处理实验_数组_12

不能将第三条的catch语句放在最前面,因为Exception已经包含后面的异常类型。排序应该先子类后父类。

【基础训练 2】自定义异常的定义与抛出。

【目标】理解自定义异常定义与抛出方式、捕获处理。

(1)自己定义一个异常并抛出。

【参考程序】程序文件名为 MyException.java

观察编译是否可通过,分析错误:

异常检测 java 算法 java异常处理实验_自定义异常_13

应该还要使用try...catch...语句。

(2)增加 try …catch 代码

异常检测 java 算法 java异常处理实验_抛出异常_14

编译通过后,执行代码,观察结果。总结如何抛出和捕获自己定义的异常:

通过throw抛出异常对象,再通过catch捕获自己定义的异常。

(3)在方法头声明方法可能产生异常。

将上面 main 方法的 try…catch 不要,在方法头增加 throws 子句:

异常检测 java 算法 java异常处理实验_抛出异常_15

程序没有通过编译,运行结果报错。分析总结如何给方法声明异常。 通过throw或者throws,总结下 throw 和throws 关键字的区别:

  • 写法上 : throw 在方法体内使用,throws 函数名后或者参数列表后方法体前
  • 意义 : throw 强调动作,而throws 表示一种倾向、可能但不一定实际发生
  • throws 后面跟的是异常类,可以一个,可以多个,多个用逗号隔开。throw 后跟的是异常对象,或者异常对象的引用。
  • throws 用户抛出异常,当在当前方法中抛出异常后,当前方法执行结束(throws 后,如果有finally语句的话,会执行到finally语句后再结束。)。可以理解成return一样。

(4)对声明异常的方法调用。将产生异常的代码安排到一个自定义方法中,在 main 方法中调用该方法。

异常检测 java 算法 java异常处理实验_数组_16

观察编译的错误指示,给 method 调用增加 try…catch 代码。

异常检测 java 算法 java异常处理实验_数组_17

执行代码,分析总结异常发生的处理流程,异常将如何改变程序的执行流程。

如果方法在执行过程中抛出异常(不管是主动抛出还是系统抛出),方法下面的代码都不会继续执行,而是去执行异常处理程序(若有)。如果try块中的代码抛出异常,会执行对应的catch块,然后继续执行finally块(若有),然后继续执行下面的代码。