利用异常处理机制相关知识,完成带有异常处理功能的计算器程序。
前言
最近学习了java中内部类和异常类的知识,那么实验自然也会对学习的内容进行巩固和练习,而这篇就是对以前的简易计算器进行改造,将其变为一个带有异常类的计算器,原实验如下:
一、实验内容
不得不说,这次的实验内容真是太丰富了,让我可以不用写实验思路(
利用异常处理机制相关知识,完成带有异常处理功能的计算器程序。具体要求:
- 定义一个完成四则运算的计算器类Calculator,该类拥有double类型的操作数number1、number2和char类型的运算符operator等3个私有成员变量,一个公共方法work以及两个供内部使用的私有方法init和compute方法。
- 私有方法init按照指定的表达式格式:“第一操作数 运算符 第二操作数”(操作数与运算符之间使用空格分割)从键盘获取操作数和运算符,并对操作数非法、运算符非合法以及0作为除数等三种异常情况进行检测,且当发生异常时能生成相应的自定义异常类的实例化对象并抛出给上层调用者(work方法)。约定:三个自定义异常类的名称分别为:MyOperandException、MyOperatorException和MyDivisorIsZeroException。
- 私有方法compute用来根据当前运算符的种类对当前的操作数执行相应的运算,并将结果返回给上层调用者(work方法)。
- 公共方法work使用循环完成多个表达式的连续计算,在每遍循环中,首先调用init方法完成操作数和运算符的获取,并捕获处理相关异常;当没有异常发生时(即表达式合法),调用compute完成计算,并按照“第一操作数 运算符 第二操作数 = 结果”输出结果;否则(即表达式非法),终止当前表达式的处理,提前进入下一遍循环,提示用户按照要求格式重新输入要计算的表达式。当用户不想再继续计算时,可退出程序。
- 给出测试类,完成完整的测试过程(包括正常情况和3种异常情况)。
- 扩展要求:自定义异常类MyExpressionException。在init方法中,能够按照指定格式“第一操作数 运算符 第二操作数”(操作数与运算符之间使用空格分割)来检查用户输入表达式的合法性,当检查出表达式非法(操作数与运算符之间未使用空格分割)时能够生成MyExpressionException的实例化对象并抛出给上层调用者(work方法);work方法应能处理这种异常。完成相应测试。
二、实验思路
如上文所述,即写出已经写过的计算器类,并按要求添加异常类,并测试
三、实验代码
import java.util.Scanner;
public class calculator {
private double number1;
private double number2;
private char operator;
private String exp;
public void work() {
Scanner sc = new Scanner(System.in);
char continueflag = 'y';
while (continueflag == 'y' || continueflag == 'Y') {
try {
init();
} catch (ExpException e) {
System.out.println("[计算机提示]" + e.getMessage());
continue;
}
System.out.println(number1 + "" + operator + "" + number2 + "=" + compute());
System.out.println("继续计算吗(y or n)?");
continueflag = sc.next().charAt(0);
}
System.out.println("谢谢使用!再见");
}
//从键盘接受数据并初始化
private void init() throws ExpException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个表达式,格式为:23 + 45");
exp = sc.nextLine();
String[] strs = exp.split(" ");
if (strs.length != 3) {
throw new ExpException("非法的表达式格式");
}
try {
number1 = Double.parseDouble(strs[0]);
operator = strs[1].charAt(0);
number2 = Double.parseDouble(strs[2]);
} catch (NumberFormatException e) {
throw new ExpException("非法的操作数");
}
if (!(operator == '+' || operator == '-' || operator == '*' || operator == '/')) {
throw new ExpException("非法的运算符");
}
if (operator == '/' && number2 == 0) {
throw new ExpException("除数不能为0");
}
}
//计算
private double compute(){
double result = 0;
switch (operator) {
case '+':
result = number1 + number2;
break;
case '-':
result = number1 - number2;
break;
case '*':
result = number1 * number2;
break;
case '/':
result = number1 / number2;
break;
}
return result;
}
}
public class ExpException extends Exception{
public ExpException(){
super("非法的表达式");
}
public ExpException(String info){
super(info);
}
}
public class testcalculator {
public static void main(String[] args){
calculator cal = new calculator();
cal.work();
}
}
四、实验结果截图
如上,可以看到不仅有着原先计算器的功能,还可以抛出异常
总结
以上就是关于异常类的计算器的内容了,可以更好的理解异常类的使用和运用。