为什么不抛出UnkownOperatorException?

时间:2017-03-08 03:53:54

标签: java exception

当用户输入以下任何内容之外的任何内容时,应抛出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";

2 个答案:

答案 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 Exceptioncatch (Exception ...)来抓住您。