2016-10-25 5 views
4

Я получаю сообщение об ошибке при запуске моего пользовательского интерфейса, которое заставляет этот код выплевывать ошибку у меня в заголовке. Он работает для всех моих других символов оператора, поэтому я действительно не уверен, что здесь происходит. Я не хотел, чтобы получить возможность отправлять весь код, так что вы можете найти остальное, если это не хватает на моем GitHub: https://github.com/jparr721/Calculator-App/tree/master/src/calculatorjava.util.regex.PatternSyntaxException: Dangling meta character '+' рядом с индексом 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

Возможных дубликат [String.split() в метасимволе +] (http://stackoverflow.com/questions/16217627/string-split-at-a-meta-character) – njzk2

ответ

7

Там резервируется символ в Regex, и вы должны усики этого характера добиться того, что вы хотеть. Например, вы не можете использовать String.split("+"), вы должны использовать String.split("\\+").

Правильный операторов будет:

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

Изменение: String[] split = nums.split(operator);

Для этого: String[] split = nums.split("\\" + operator);

редактировать: Это будет работать только для стандартных операторов, а не х или X.» Вам придется изменить свою декларацию String[] operators, как и на другой ответ. Лично хотя, я бы сделать какой-то проверки входных данных и сделать замену() на x или X быть * вместо

0

раскола() метод использует регулярное выражение. символ '+' является специальным символом в регулярном выражении, поэтому вам нужно избежать его с помощью символа обратной косой черты ('\'). Но вам также нужно избегать символа обратной косой черты в java, поэтому вам нужны две обратные косые черты, например. «\\ +»

0

в вашем случае +* и ^ рассматриваются со специальным значением, чаще всего называемым метасимволами. String.split() принимает в качестве аргумента выражение регулярного выражения и возвращает массив String. Для того, чтобы избежать лечений выше как метасимволы вам нужно использовать эти управляющие последовательности в коде "\\+""\\*""\\^"

изменить ваш массив оператора, как этот

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

для более Detalis refere этих ссылок regex.Pattern и String.split()

+0

Это не сработало, у вас есть другие идеи о том, что может быть используя это? –

+0

Может ли сообщение после стека отслеживать ошибку? – prabath

Смежные вопросы