java异常处理实验

声明一个 Average 接口,继续完善学生信息录入程序,其中约定求平均
值的方法;声明多个类实现 Average 接口,分别给出求平均值的方法实现。例如,
在一组数值中,一种算法是,全部数值相加后求平均值,另一种算法是,去掉一
个最高分和一个最低分后,再将总分求平均等;使用键盘输入数据时,对于不能
转换成数值的字符串进行异常处理
Student2类
package Test;

public class Student2 {
    private String name;
    private int age;
    private double score;
    private int year;
    private int month;
    private int day;

    public Student2(String name,int age,int year,int month,int day,double score){
        this.name = name;
        this.age = age;
        this.year = year;
        this.month = month;
        this.day = day;
        this.score = score;
    }
    public Student2(){};
    public void set(String name,int age,int year,int month,int day,double score)
    {
        this.name = name;
        this.age = age;
        this.year = year;
        this.month = month;
        this.day = day;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getScore() {
        return score;
    }

    public int getYear() {
        return year;
    }

    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

    public void show(){
        System.out.printf("name: %15s  age: %3d  year: %5d  month: %3d  day: %3d  markOfJava: %6.2f",
                this.name,this.age, this.year,this.month,this.day,this.score);
    }
}

ErrorInputException类

package Test;

public class ErrorInputException extends Exception{
    String message;
    public ErrorInputException(String str)
    {
    message=str+"字符串不能转换成数值,出现异常";
    }
    public String ToString()
    {
        return message;
    }

}

主程序Lab3_3类

package Mypackage;

import Test.ErrorInputException;

import Test.Student2;

import java.util.Scanner;

import static java.lang.System.exit;

public class Lab3_3 {
    interface Average {
        public double ave(Test.Student2[] students);
    }

    public static class Type1 implements Average {
        @Override
        public double ave(Test.Student2[] students) {
            double sum = 0.0;
           for(int i=0;i< students.length;i++) {
               sum += students[i].getScore();
           }return sum / students.length;
        }
    }

    public static class Type2 implements Average {
        @Override
        public double ave(Test.Student2[] students) {
            double max = students[0].getScore();
            double min = students[0].getScore();
            double sum = 0.0;
            for (Test.Student2 student : students) {
                if (student.getScore() >= max) {
                    max = student.getScore();
                } else {
                    if (student.getScore() <= min) {
                        min = student.getScore();
                    }
                }
            }
            for (Test.Student2 student : students) {
                if (student.getScore() != max && student.getScore() != min) {
                    sum += student.getScore();
                }
            }
            return sum / (students.length-2);
        }
    }

    public static void main(String[] args) throws ErrorInputException {
        System.out.println("请输入学生人数:");
        Scanner input = new Scanner(System.in);
        int numOfStudent = input.nextInt();//学生人数
        input.nextLine();
        Test.Student2[] students = new Test.Student2[numOfStudent];
        String name;
        String age;
        String year;
        String month;
        String day;
        String score;
        for (int i = 0; i < numOfStudent; i++) {
            students[i]=new Test.Student2();
            System.out.println("请依次输入name,age,year,month,day,score");
            name = input.next();
            try {
                age = input.next();
                year = input.next();
                month = input.next();
                day = input.next();
                score = input.next();
                for (char str : age.toCharArray()) {
                  if(str<'0'||str>'9')
                  throw new ErrorInputException(age);
                }
                for (char str : year.toCharArray()) {
                    if(str<'0'||str>'9')
                    throw new ErrorInputException(year);
                }
                for (char str : month.toCharArray()) {
                    if(str<'0'||str>'9')
                    throw new ErrorInputException(month);
                }
                for (char str : day.toCharArray()) {
                    if(str<'0'||str>'9')
                    throw new ErrorInputException(day);
                }
                for (char str : score.toCharArray()) {
                    if(str<'0'||str>'9')
                    throw new ErrorInputException(score);
                }
                students[i].set(name,Integer.valueOf(age),Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day),Double.valueOf(score));
            } catch (ErrorInputException e) {
                System.out.println(e.ToString());
                exit(0);
            }finally {
                System.out.println("");
            }
        }//对数组进行输入,输入了学生信息
       Lab3_3.Type1 a=new Lab3_3.Type1();
        Lab3_3.Type2 a2=new Lab3_3.Type2();
        System.out.println("第一种平均成绩为"+a.ave(students));
        System.out.println("第二种平均成绩为"+a2.ave(students));


    }
}

实验总结分析

在调试的时候出现了很多问题,

1.第一个问题是显示students[i]为空,检查得知和实验一的问题一样,我在Student2[] students=new Student2[numofStudent]后,没有对每一个students进行动态内存分配,于是加了个for循环,students[i]=new Student2();问题得以解决

2.本题需要判断输入的字符串能不能转换为数值,而此前我用Student2这个类的时候,像year month成员变量都不是String字符串类型,而这里必须要为字符串类型,所以上网搜了下,可以在初始化initialize的时候将String转换为int类型和double类型,分别用Integer.valueof()和Double.valueof()即可正确的初始化赋值。

3.

最开始我把对students[i]的初始化赋值写在了异常处理的前面,导致如果有异常的话,还没来得及处理,就执行赋值这一步,会出现错误,经调整后,把这个初始化赋值代码调整到异常处理后,问题得以解决。

4.在写此代码的时候用到了类的封装性访问权限的知识,最开始在Student2类中无参初始化的访问权限为缺省,而我这里Studen2类和Lab3_3类不是在同一个包中,缺省权限的访问控制只能由类内或包内其他类访问,所以我将Student2无参构造的权限改为了public,就得以在Lab3_3中得以调用

5.用到了内部类的知识。在Lab3_3类中,Type1和Type2都是内部类,内部类要靠外部类的实例化来访问,所以当我想调用Type1中的方法时,要先Lab3_3.Type1 a=new Lab3_3.Type1();来构造一个实例化,然后用a.ave()调用Type1中的方法。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很抱歉,作为AI语言模型,我无法完成实验报告的撰写任务。不过我可以提供一些关于Java异常处理的信息,希望能对你有所帮助。 Java异常处理Java编程语言中的重要概念之一,可以帮助开发人员编写更加健壮、可靠的程序。当程序发生异常情况时,Java虚拟机会抛出异常,如果不进行处理,程序将会中断运行。因此,了解异常处理的相关知识是非常必要的。 Java异常分为Checked Exception和Unchecked Exception两种类型。Checked Exception必须在代码中进行处理或者抛出,否则编译器会报错。而Unchecked Exception则不需要显式进行处理,可以在代码中选择处理或者让程序崩溃。 在Java中,异常处理主要通过try-catch-finally语句块来实现。try块中包含可能引发异常的代码,catch块中包含异常处理代码,finally块中包含一定会执行的代码,无论try块中是否发生异常。 以下是一个简单的Java异常处理示例代码: ```java public class ExceptionTest { public static void main(String[] args) { try { int[] array = new int[5]; array[10] = 3; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组越界异常"); } finally { System.out.println("finally块一定会执行"); } } } ``` 在上面的代码中,try块中修改了一个长度为5的数组的第10个元素,会引发ArrayIndexOutOfBoundsException异常。在catch块中对这个异常进行了处理,输出了一条错误信息。在finally块中输出了一条一定会执行的信息。 希望这些信息对你有所帮助。如果你还有其他问题或需要更深入的了解,可以随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Programming.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值