2016-10-25 9 views
4

私のUIを起動するとエラーが発生します。このコードにより、このコードではタイトルにエラーが表示されます。私の他のオペレータシンボルのすべてに対して機能するので、ここで何が起こっているのか分かりません。これが私のGitHub上で十分でない場合は、残りの部分を見つけることができますので、私はすべてのコードを投稿したくありませんでした:https://github.com/jparr721/Calculator-App/tree/master/src/calculatorjava.util.regex.PatternSyntaxException:インデックス0の近くのメタ文字「+」のぶら下がり

public class Calculation_Controls { 

    public double A, B; 

    private String[] operators = new String[] {"-","+","/","*","x","^","X"}; 


    /** 
    * Check for the symbol being used within the TextArea to then 
    * apply the correct caculation method. 
    * FIXME - Allow for multiple symbols to be used and have them return 
    * FIXME - a result in accordance with PEMDAS 
    * 
    *@param nums 
    * 
    * @return operator, or error 
    */ 
    public String findSymbol(String nums) { 

     for (String operator : operators) { 
      if (nums.contains(operator)) { 
       return operator; 
      } 
     } 
     return "invalid input"; 
    } 

    /** 
    * Input method to take the user input from the text area 
    * and apply the correct calculation to it 
    * 
    * @param nums - Stores the input as a String which I then convert to an int 
    *    then back to a string to be printed to the TextArea 
    * 
    * @return - The result of the calculation as a string 
    */ 
    public String input(String nums){ 

     String operator = findSymbol(nums); 
     if (operator == null){ 
      System.out.println("Invalid input"); 

     } 
     String[] split = nums.split(operator); 
     int left = Integer.parseInt(split[0]); 
     int right = Integer.parseInt((split[1])); 
     String result = ""; 

     switch (operator){ 

      case "+": 
       result = Double.toString(add(left, right)); 
       break; 
      case "-": 
       result = Double.toString(subtract(left, right)); 
       break; 
      case "*": 
      case "x": 
      case "X": 
       result = Double.toString(multiply(left, right)); 
       break; 
      case "/": 
       result = Double.toString(divide(left, right)); 
       break; 
      case "^": 
       result = Double.toString(pwr(left, right)); 
       break; 
      default: 
       System.out.println("Invalid Operator"); 
     } 
     return result; 
    } 
+2

可能性をREFERE変更します[String.split()のメタ文字の複製+](http://stackoverflow.com/questions/16217627/string-split-at-a-meta-character) – njzk2

答えて

7

あり、正規表現の予約文字があり、あなたは何を達成するために、これらの文字をスケープ必要があります欲しいです。たとえば、String.split("+")は使用できません。String.split("\\+")を使用する必要があります。

正しい演算子は次のようになります。

String[] operators = new String[] {"-","\\+","/","\\*","x","\\^","X"}; 
0

変更:これにString[] split = nums.split(operator);

String[] split = nums.split("\\" + operator);

編集:これは、標準の演算子のために動作します、ではないxまたはX.あなた」あなたのString[] operators宣言を実際に変更する必要があります。個人的には、何らかの入力検証を行い、xまたはXの代わりに*となるようにします。

0

split()メソッドは正規表現を使用します。 '+'記号は正規表現の特殊文字なので、バックスラッシュ記号( '\')でエスケープする必要があります。しかし、Javaのバックスラッシュ記号をエスケープする必要もあります。そのため、2つのバックスラッシュが必要です。 「\\ +」

0

あなたの場合+*および^は、ほとんどの場合メタキャラクタと呼ばれる特別な意味で扱われます。 String.split()メソッドは引数として正規表現を取り、配列Stringを返します。 "\\^""\\*""\\+"あなたのコードでこれらのエスケープシーケンスを使用する必要がメタキャラクタとして上記

を処理回避するために、よりdetalisため、この

private String[] operators = new String[] {"-","\\+","/","\\*","x","\\^","X"}; 

のようなあなたのオペレータアレイは、これらのリンクregex.PatternString.split()

+0

これは機能しませんでした。どのようなことができるかの他のアイデアこれを使って? –

+0

は、エラーのスタックトレースを投稿できますか? – prabath

関連する問題