2017-03-08 3 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()); 
      } 
     } 
     } 
    } 

これが本当であることはない

i == ALL_OPERATORS.length() 

以来ALL_OPERATORS

private final String ALL_OPERATORS = "+-*/RP"; 

答えて

2

である(または常にfalseである)、なぜ?あなたがループするかどうか自問自答してください

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

これはこれまでに起こるでしょうか?


は、だからあなたのif内のコードは到達しませんので、UnkownOperatorExceptionがスローされることはありません。


Stringエントリの最初の文字がALL_OPERATORSの中の1あるかどうかを確認するために、他の方法は、あなたの構造を簡素化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. 
} 

はもちろん、私はここにあるエラー・チェックアウト左:それは懸念を分離列挙型のアプローチを持っている方が良いでしょう。

enumから例外をスローしないでください!それはnullからfromStringに戻ってくるコードから投げてください。

throws Exceptionまたはcatch (Exception ...)をもう一度使用してあなたをキャッチしないでください。

+0

私はまだ学んでいます...まだenumをカバーしていません – mark1092

+1

Javaチュートリアルで先読みする価値があります。ここでの例は、そのパワーに関するヒントを与えるかもしれません。 –

関連する問題