中南大学计算机学院实验报告
课程名称 Java面向对象程序设计SSD3
实验项目名称 实验6《异常处理》
学生姓名 Xi_Chen123 专业班级 ******* 学号 **********
实验成绩 日期
实验学时: 2
每组人数: 1
实验类型: 1 (1:基础性 2:综合性 3:设计性 4:研究性)
实验要求: 1 (1:必修 2:选修 3:其它)
实验类别: 2 (1:基础 2:专业基础 3:专业 4:其它)
- 实验目的
- 编写try-catch块处理异常
- 理解异常处理过程
- 实验内容
1.【NumberFormatException异常】编写一个程序,提示用户输入两个整数,然后显示它们的和。用户输入错误时提示用户重新输入。
2.(P419, 12.3)【ArrayIndexOutOfBoundsException异常】编写一个程序,创建一个由100个随机选取的整数构成的数组;提示用户输入数组下标,然后显示元素的值,如果指定的下标越界,显示消息out of bounds。
3. 请将393页图12-3所示的内容转换成可运行的代码,尝试抛出不同类型的异常,理解寻找异常处理器的过程及代码执行的流程。
要求每个学生独立完成实验任务。
四、实验报告
1.在一周内完成本项目实验,在可视化平台上提交实验文档,包括:.java文件(分别对应以上3道题,不需要.class文件)打包成一个名为“实验6”的.rar或.zip文件,以及实验报告1份(格式与要求见下),报告命名为“班级名(如“2101”)_学号_姓名_实验6.doc”。
2. 实验结果与分析
(包括运行结果截图等)
实验一
实验二
实验三
3. 心得体会
(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。)
在编写实验一的过程中,编写的思路是先将未进行异常处理的程序编写出来。由于思维惯性,所以在第一次编写的时候就将输入两个整型数据的程序编写为:
于是,在第一次测试时,当我输入浮点数,JVM虚拟机显示出现的错误类型为: InputMismatchException,不符合我们需要的错误类型:NumberFormatException
InputMismatchException错误是在Scanner过程中,由于输入的数据类型与接收器的类型不一致导致的错误;NumberFormatException是在将字符串类型数据转换成其他数据的过程中,预期类型中没有与该字符串匹配的错误类型。要想实现NumberFormatException的错误类型,必须将上述Scanner的数据输入过程修改成字符串作为接收结果,并调用Integer类中的parseInt()方法进行转换,代码如下:
其次,正常的程序在检验报错一次后就会跳出错误程序,继续执行,但我们的题目要求是需要继续循环输入,直到用户输入正确的数据类型为止。因此我们需要使用循环结构进行循环输入。由于循环次数最少为1次,且循环次数不确定,故使用do…while结构,创建一个boolean类型的flag变量用于判断是否正常输入数据并决定程序跳出循环。
在编写实验二的过程中,首先需要创建一个100个数据大小的随机数数组,该操作需要调用Math类中的random方法来生成0~1之间的随机数,由于题目要求为整数数组,因此需要对所有生成的随机数乘100然后强转为int类型数据,强转的语句如下:
其次,正常的程序在检验报错一次后就会跳出错误程序,继续执行,但我们的题目要求是需要继续循环输入,直到用户输入正确的数据类型为止。因此我们需要使用循环结构进行循环输入。由于循环次数最少为1次,且循环次数不确定,故使用do…while结构,创建一个boolean类型的flag变量用于判断是否正常输入数据并决定程序跳出循环。
在编写实验三的过程中,需要体会在函数的嵌套或调用中,异常处理的特征和性质。于是我编写了三个method:在main函数中调用method1();在method1()中调用method2();在method2()中调用method3(),最后在method中通过从main函数中传来的参数决定最终会抛出什么类型的异常。我推荐的该程序编写顺序为先将所有的未设定异常处理的代码编写完成,后来将method3()中switch结构编写完成,用来抛出不同的异常,最后用try…catch…包裹住各调用的函数,最后用System.out.println(“…”)编写程序运行过程中经历的提示信息。
在和其他同学交流的过程中,发现了另一种体会异常处理的形式,那就是通过一个现实世界中存在实例程序,寻找到在这个程序运行过程中可能出现的几种异常,并对这几种异常进行异常的处理和抛出。
(感谢王**同学的耐心指导)
4. 附源代码
exercise1
package com.xc6;
//1.【NumberFormatException异常】编写一个程序,提示用户输入两个整数
// 然后显示它们的和。用户输入错误时提示用户重新输入。
import java.util.Scanner;
public class exercise1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个整数:");
boolean flag = true;
int num1 = 0;
int num2 = 0;
//捕获异常
do {
try {
//输入数据
num1 = Integer.parseInt(sc.next());
num2 = Integer.parseInt(sc.next());
flag = false;//若程序无异常,则跳出循环
} catch (NumberFormatException e) {
System.out.println("输入数据格式有误,请重新输入");
}
} while (flag);
//输出结果
System.out.println(num1 + num2);
}
}
exercise2
package com.xc6;
//【ArrayIndexOutOfBoundsException异常】编写一个程序,创建一个由100个随机选取的整数构成的数组
// 提示用户输入数组下标,然后显示元素的值,如果指定的下标越界,显示消息out of bounds。
import java.util.Scanner;
public class exercise2 {
public static void main(String[] args) {
//创建随机数组
int[] num = new int[100];
for (int i = 0; i < num.length; i++) {
num[i] = (int) (Math.random() * 100);
}
boolean flag = true;
do {
//输入数组下标
System.out.println("请输入想要查看的数组下标:");
Scanner sc = new Scanner(System.in);
int index = sc.nextInt();
try {
//显示元素的值
System.out.println(num[index]);
flag = false;
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("out of bounds");
}
} while (flag);
}
}
exercise3
package com.xc6;
//请将393页图12-3所示的内容转换成可运行的代码,尝试抛出不同类型的异常,理解寻找异常处理器的过程及代码执行的流程。
import java.util.Scanner;
public class exercise3 {
//主函数
public static void main(String[] args) {
//输入1,2,3,4来体会捕获异常
Scanner sc = new Scanner(System.in);
System.out.println("1.体会异常:ArithmeticException");
System.out.println("2.体会异常:NullPointerException");
System.out.println("3.体会异常:ArrayIndexOutOfBoundsException");
System.out.println("4.体会异常:IllegalAccessException");
System.out.println("--------------------------------");
System.out.println("main函数中匹配ArithmeticException");
System.out.println("method1()中匹配NullPointerException");
System.out.println("method2()中匹配ArrayIndexOutOfBoundsException");
System.out.println("method3()中匹配IllegalAccessException");
System.out.println("请输入1,2,3,4来体会捕获异常");
int num = sc.nextInt();
//捕获main函数中的错误
try {
method1(num);
} catch (ArithmeticException e) {
System.out.println("在main函数中发现了错误");
System.out.println("ArithmeticException");
}
//经过函数
System.out.println("经过了main函数");
}
//函数1
public static void method1(int num) {
//捕获方法1中抛出的错误
try {
method2(num);
} catch (NullPointerException e) {
System.out.println("在方法1中发现了错误");
System.out.println("NullPointerException");
}
System.out.println("经过了函数1");
}
//函数2
public static void method2(int num) {
//捕获方法2中抛出的错误
try {
method3(num);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("在方法2中发现了错误");
System.out.println("ArrayIndexOutOfBoundsException");
}
System.out.println("经过了函数2");
}
//函数3
public static void method3(int num) {
//捕获方法3抛出的异常
try {
switch (num) {
case 1:
throw new ArithmeticException();
case 2:
throw new NullPointerException();
case 3:
throw new ArrayIndexOutOfBoundsException();
case 4:
throw new IllegalAccessException();
}
} catch (IllegalAccessException e) {
System.out.println("在方法3中发现了错误");
System.out.println("IllegalAccessException");
}
System.out.println("经过了函数3");
}
}