接口
package caculater1.inter;
public interface Computing {
public double res(double a,double b)
/*2.0的有問題版本
public static double res(double a,double b) {
return 0;
}
*/
}
Map
import java.util.HashMap;
import caculater1.computing.*;
import caculater1.inter.Computing;
public class Compute {
@SuppressWarnings("serial")
public static HashMap<String, Computing> map = new HashMap<String,Computing>() {
{
put("+", new Add());
put("-", new Sub());
put("*", new Mul());
put("/", new Div());
}
};
public static Computing getOperator(String operator) {
return map.get(operator);
}
}
計算
package caculater1.computing;
import caculater1.inter.Computing;
public class Add implements Computing{
public double res(double a, double b) {
return a+b;
}
}
public class Sub implements Computing{
public double res(double a, double b) {
return a-b;
}
}
public class Mul implements Computing{
public double res(double a, double b) {
return a*b;
}
}
public class Div implements Computing{
// @SuppressWarnings("null")
public double res(double a, double b) {
return a/b;
/* try {
return a/b;
} catch (Exception e) {
System.out.println("Division by Zero");這一行并不會被顯示
return (Double) null;
java中除Double(0)并不會拋出異常冤今,而是返回Infinity,但try-catch對此仍然有效纯续;return null會返回NaN(Not a Number)晚凿。
*/
}
}
}
輸入
package caculater1;
import java.util.Scanner;
public class ComputerScanner {
public static Object Inp(){
String str;
Double n;
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
str = sc.nextLine();
try{
n = Double.parseDouble(str);
return n;
}catch (Exception e){
return Compute.getOperator(str);
}
}
}
主程序
package caculater1;
import caculater1.inter.Computing;
public class Caculater1 {
public static void main(String[] args) {
Double res = 0.0;
Computing ope = null;
while(true){
Object obj = ComputerScanner.Inp();
if(obj==null){
continue;
}else{
if(ope==null){
if(obj instanceof Double){
res = (Double) obj;
}else if(obj instanceof Computing){
ope =(Computing) obj;
}else{
System.out.println("Error input");
}
}else{
if(obj instanceof Double){
Double num = (Double) obj;
res = ope.res(res,num);
// res = Computing.res(res, num);2.0中的錯誤
System.out.println("Result: "+res);
ope = null;//2.0中未加入這一行導(dǎo)致運行情況與預(yù)期不符
}else if(obj instanceof Computing){
ope = (Computing) obj;
}else{
System.out.println("Error input");
}
}
}
}
}
}
使用debug排除了2.0版本的錯誤
2.0版本bug
1.沒有新建一個Computing的對象补疑,直接調(diào)用Computing伊佃,按照eclipse提示修改Computing為static陪竿。導(dǎo)致后續(xù)問題
2.主程序設(shè)計思路漏洞