题目描述:
自定义一个异常类ScoreException
,继承自Exception类。有一个私有的成员变量message
(异常提示信息,String类型);一个公有的无参数的构造方法,在方法中将message的值确定为“您输入的成绩异常,请核实!
”;一个公有的方法show()
,该方法的功能是输出message的值。
定义一个学生类Student
,有一个私有成员变量score
(成绩,double类型);一个带参数的公有方法setScore()
用于设置学生的成绩,该方法声明可能抛出异常ScoreException,当设置的成绩为负数或超过100时,会抛出一个异常对象;一个公有方法getScore()
用于获取学生的成绩。
在测试类Main
中,创建一个Student类的对象zhangsan,尝试调用setScore()方法来设置他的成绩(成绩从键盘输入,double类型),然后调用getScore()方法获取到该成绩后再将其输出。因用户的输入存在不确定性,以上操作有可能捕捉到异常ScoreException,一旦捕捉到该异常,则调用show()方法输出异常提示。不管是否有异常,最终输出“程序结束”。使用try...catch...finally语句实现上述功能。
输入格式:
输入一个小数或整数。
输出格式:
可能输出:
成绩为XXX
程序结束
也可能输出:
您输入的成绩异常,请核实!
程序结束
输入样例1:
-20
输出样例1:
您输入的成绩异常,请核实!
程序结束
输入样例2:
90
输出样例2:
成绩为90.0
程序结束
题目分析:
在该代码中,创建三个类(Student,ScoreExcetption,Main)分别用于调取成绩、捕获异常、进行实验。
设计重点:
如何做到保留一位小数:
起初我想使用的是DecimalFormat工具类,用法如下:
double num = 11.256;
DecimalFormat df = new DecimalFormat("#.##");
//指定RoundingMode
df.setRoundingMode(RoundingMode.HALF_UP);
String str = df.format(num);
double formatNum = Double.parseDouble(str);
System.out.println(formatNum);
然而,这套方法只适用于截断(即把23.3388四舍五入为23.34)并不适用于小数点后补零。
后面改为了String.format( )方法,成功解决保留小数问题:
为什么自定义异常抛出失败:
class ScoreException extends Exception {
上面这样是错误的,只有在编译时就出现异常才能继承Exception类。运行时异常要继承RuntimeException类。
class ScoreException extends RuntimeException {
如何捕获异常:
要先在set方法中设定挡输入的数字为负数或大于100时,抛出自定义异常ScoreExcption,然后在主函数中用try catch语句捕获。
最终代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Student A = new Student();
try {
A.setScore(sc.nextDouble());
double c = A.getScore();
System.out.println("成绩为" + String.format("%.1f", c));
} catch (ScoreException e) {
System.out.println("您输入的成绩异常,请核实!");
}
System.out.println("程序结束");
}
}
//学生类
class Student {
private double score;
public void setScore(double score) {
if (score > 100 || score < 0) {
throw new ScoreException();
}
this.score = score;
}
public double getScore() {
return score;
}
}
class ScoreException extends RuntimeException {
}
总结:复习异常的捕获,抛出,自定义的过程。掌握保留小数点的方法。