Java语言中自定义异常类与断言综合实验
文章目录
- Java语言中自定义异常类与断言综合实验
- 一、实验目的:
- 二、实验题目:
- 三、实验要求:
- 四、数据及运行结果:
- 五、实验小结
- 六、 完整代码
一、实验目的:
1、掌握可抛出异常及异常处理;
2、掌握自定义异常类的抛出、捕捉及异常处理程序设计;
3、理解断言在程序设计中的作用;
4、掌握利用断言设置进行程序调试。
二、实验题目:
在文件Experiment19.txt中每一行应该2项内容,为被除数和除数用空格隔开,现要求遍历该文件计算并打印出每一行整除之后的商的总和。
1、如果一行不是2项则抛出自定义类型的错误ErrorFormat,并在屏幕上输出 “错误:该行格式有误!”;
2、如果被除数或除数无法解析为整形,则处理该行时在屏幕上输出“错误:该行无法解析为整型!”;
3、使用异常捕获除以0的行,并在屏幕上输出“错误:除数为0!”
三、实验要求:
(1)不得修改文件中的数据、以及数据的顺序;
(2)要进行读取的数据文件名,请在运行时用命令行参数的形式输入,在程序中用args[0]作为文件名,进行文件操作;
package experiment19;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ExceptionLab {
public static void main(String[] args) {
try {
System.out.println("请输入文件名:"); // 文件路径为:E:\Java\src\experiment19\Experiment19.txt
Scanner scanner = new Scanner(System.in);
String fileName = "E:\\Java\\src\\experiment19\\" + scanner.nextLine(); // 得到String类型的文件名
File f = new File(fileName); // 创建一个文件类型的变量
Scanner sc = new Scanner(f); // 通过Scanner对象把文件中的数据以String类型逐行读取
(3)通过Scanner对象把文件中的数据以String类型逐行读取;
while (sc.hasNextLine()) {
String n = sc.nextLine(); // 按行读取
System.out.println("");
}
(4)调用包装类把除数和被除数转换成int型数据;
int a = Integer.parseInt(data[0]); // 被除数转换成int类型
int b = Integer.parseInt(data[1]); // 除数转换成int类型
(5)如果出现异常,进行处理,继续读取下一个数据,直到把整个文件数据读取完成为止。
try{
可能出现异常的代码段
}
catch(异常类1 e1){
处理异常程序段
}
catch(异常类2 e2){
处理异常程序段
}
......
[Finnally{
程序段
}]
(6)调试时,启用“断言”;正常运行时不启用“断言”。
java -ea .class文件名
四、数据及运行结果:
Experiment19.txt里的内容如下:
五、实验小结
在读取文件时,必须加入异常处理,处理文件不存在的情况。
在异常处理时,是根据代码一行一行的处理。
在try catch语句中变量的作用域都只在try catch语句中。
在捕获异常时,先捕捉子类,再捕捉父类。
所有自定义异常类都是Exception的子类
六、 完整代码
package experiment19;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ExceptionLab {
public static void main(String[] args) {
try {
System.out.println("请输入文件名:"); // 文件路径为:E:\Java\src\experiment19\Experiment19.txt
Scanner scanner = new Scanner(System.in);
String fileName = "E:\\Java\\src\\experiment19\\" + scanner.nextLine(); // 得到String类型的文件名
String[] data = new String[0]; // 储存每一行分割后的数据
double sum = 0; // 所有行的商的和
File f = new File(fileName); // 创建一个文件类型的变量
Scanner sc = new Scanner(f); // 通过Scanner对象把文件中的数据以String类型逐行读取
while (sc.hasNextLine()) {
try {
String n = sc.nextLine(); // 按行读取
System.out.println("");
data = n.split(" "); // 以空格作为分割符,储存在data
//System.out.println(Arrays.toString(date));
if (data.length != 2) { // 如果一行不是2项
throw new ErrorFormat(); // 抛出自定义错误(格式错误)
}
int a = Integer.parseInt(data[0]); // 被除数转换成int类型
int b = Integer.parseInt(data[1]); // 除数转换成int类型
assert b != 0 : "错误:断言除数为0!";
int consult = a / b; // 求商
System.out.print("被除数=" + a + " ");
System.out.print("除数=" + b + " ");
System.out.print("被除数/除数=" + consult);
sum += consult; // 累计求每行商的和
} catch (AssertionError e) { // 断言错误
System.out.print("错误:断言除数为0!");
System.out.print(data[0] + " " + data[1]);
} catch (ArithmeticException e) {
System.out.print("错误:除数为0!" + data[0] + " " + data[1]);
} catch (ErrorFormat e) { // 自定义错误(格式错误)
for (String s : data) { // 输出这一行所有项
System.out.print(s + " ");
}
} catch (NumberFormatException e) { // 无法化为整型的错误
System.out.print("错误,该行无法解析为整型!" + data[0] + " " + data[1]);
}
}
System.out.println("");
System.out.println("所有商之和为:" + sum + "。");
}catch (FileNotFoundException e){
System.out.println("文件没有找到");
}
}
}
class ErrorFormat extends Exception { // 自定义错误类ErrorFormat从父类Exception
public ErrorFormat() {
super("错误:该行格式有误");
System.out.print("错误:该行格式有误!");
}
}