2017-03-08 57 views
0

當用戶輸入以下任何一項時,應引發UnknownOperatorException + - */PR
但是,它似乎不能正常工作。這裏是一個示例輸出。UnkownOperatorException爲什麼不被拋出?

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

由於

i == ALL_OPERATORS.length() 

永遠不會是真實的(或總是false),爲什麼呢?問問自己,如果你內循環

for(int i = 0; i < ALL_OPERATORS.length();i++) 

會發生什麼?


所以你if內的代碼永遠不會達到,因此UnkownOperatorException永遠不會拋出。


的另一種方法,以檢查是否String條目的第一個字符是一個躋身ALL_OPERATORS是使用contains()

+2

這是有道理的。所以我只需要從長度中減去1 ...... – mark1092

+0

@ mark1092應該可以工作,但除非您嘗試一下,否則無法保證。 – nullpointer

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. 
} 

顯然我忽略了錯誤檢查在這裏和那裏。

不要從枚舉中拋出異常!從fromString返回null的代碼中拋出它。

千萬不要讓我們再次使用throws Exception或。

+0

我還在學習......我們還沒有涉及枚舉迄今爲止 – mark1092

+1

這是值得在Java教程中提前閱讀,這裏的例子可能會提供一些關於它的力量的提示。 –

相關問題