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("错误:该行格式有误!");
    }
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值