当用户输入以下任何内容之外的任何内容时,应抛出UnknownOperatorException + - * / PR
但是,它似乎没有正常运行。这是一个示例输出。
Enter an operator and a number:
+5
Enter an operator and a number:
g9
5.0
主类从不专门输出消息,但抛出异常的方法确实如此...所以如果捕获异常不应该打印消息?
这是我的主要课程:
public class Main{
public static void main (String[] args) throws Exception {
Calculator a = new Calculator(0);
a.setNumber(a.aResult(a));
a.setNumber(a.aResult(a));
String theString = String.valueOf(a.getNumber());
System.out.println(theString);
}
}
这是调用抛出异常的方法的方法
public void whatOperator() throws Exception
{
String operatorString = null;
operatorString = enterNumber();
// shouldn't this test the string and throw the exception if needed?
throwOperatorException(operatorString);
if(operatorString.substring(1).equals(""))
{
switch(operatorString){
case "R":
result = RESET;
break;
case "P":
System.out.println("Goodbye");
System.exit(0);
}
}
else
theNumber = Double.parseDouble(operatorString.substring(1));
char theOperator = operatorString.charAt(0);
this.operator = theOperator;
operatorString ="";
operatorString += theOperator;
switch(operatorString){
case "*":
result = getNumber() * theNumber;
break;
case "/":
result = getNumber() / theNumber;
break;
case "+":
result = getNumber() + theNumber;
break;
case "-":
result = getNumber() - theNumber;
break;
}
}
最后是异常方法本身。不知怎的,它没有被抛出。我认为这与嵌套在其中的if语句有关,但我不确定如何解决这个问题。
public void throwOperatorException(String entry) throws Exception
{
char oneOperator;
for(int i = 0; i < ALL_OPERATORS.length();i++)
{
oneOperator = ALL_OPERATORS.charAt(i);
if(entry.charAt(0) != oneOperator && i == ALL_OPERATORS.length())
{
try{
throw new UnkownOperatorException(entry);
}catch(UnkownOperatorException e){
System.out.println(e.getMessage());
}
}
}
}
这是ALL_OPERATORS
private final String ALL_OPERATORS = "+-*/RP";
答案 0 :(得分:2)
自
i == ALL_OPERATORS.length()
永远不会是真的(或总是false
),为什么?问问自己是否在内部循环
for(int i = 0; i < ALL_OPERATORS.length();i++)
会不会发生?
因此,if
中的代码永远不会到达,因此永远不会抛出UnkownOperatorException
。
检查String
条目的第一个字符是ALL_OPERATORS
中的第一个字符的另一种方法是使用contains()
答案 1 :(得分:0)
简化您的结构。除非这是唯一的工作,否则不要将方法命名为throwXxException
。最好采用一种分离关注点的枚举方法:
public enum Operator {
PLUS("+") {
@Override int op(Integer args ...) {
return args[0] + args[1];
}
},
MINUS("-") { // similarly ...
},
// etc.
;
private final String symbol;
abstract public int op(Integer args ...);
Operator(String symbol) {
this.symbol = symbol;
}
public static Operator fromString(String entry) {
final String symbol = entry.substring(0, 1);
for (Operator operator : values) {
if (symbol.equals(operator.symbol)) {
return operator;
}
}
return null;
}
// @Override public String toString() etc.
}
显然我在这里和那里都没有错误检查。
不要从枚举中抛出异常!从从null
获取fromString
的代码中删除它。
请勿让我们再次使用throws Exception
或catch (Exception ...)
来抓住您。