2015-12-08 4 views
-3

Задача заключалась в создании постфикса для инфиксного конвертера с использованием Stacks. Программа компилируется правильно, но когда я попытался создать демонстрационный класс, я получил строку исключений с нулевой точкой 32. Пожалуйста, поделитесь любыми замечаниями, лучшими соглашениями о кодировании или решениями.Почему эта программа не работает должным образом?

import java.util.Stack; 

public class PostfixtoInfix { 
    private String expression; 
    private Stack<Character> s; 
    Character pOpen = new Character('('); 
    Character pClose = new Character(')'); 

    public String PostfixtoInfix(String e) { 
     expression = e; 
     String output = ""; 
     for (int i = 0; i < e.length(); i++) { 
      char currentChar = e.charAt(i); 
      if (isOperator(currentChar)) { 
       while (!s.empty() && s.peek() != pOpen 
         && hasHigherPrecedence(s.peek(), currentChar)) { 
        output += s.peek(); 
        s.pop(); 
       } 
       s.push(currentChar); 
      } else if (isOperand(currentChar)) { 
       output += currentChar; 
      } else if (currentChar == '(') { 
       s.push(currentChar); 
      } else if (currentChar == ')') { 
       while (!s.empty() && s.peek() != pClose) { 
        output += s.peek(); 
        s.pop(); 
       } 
      } 
      while (!s.empty()) { 
       output += s.peek(); 
       s.pop(); 
      } 
     } 
     return output; 
    } 

    public boolean isOperator(char c) { 
     if (c == '+' || c == '-' || c == '/' || c == '*' || c == '^') 
      return true; 
     return false; 
    } 

    public boolean isOperand(char c) { 
     if (c >= '0' && c <= '9') 
      return true; 
     if (c >= 'a' && c <= 'z') 
      return true; 
     if (c >= 'A' && c <= 'Z') 
      return true; 
     return false; 
    } 

    public int getOperatorWeight(char operator) { 
     int weight = -1; 
     switch (operator) { 
     case '+': 
     case '-': 
      weight = 1; 
      break; 

     case '*': 
     case '/': 
      weight = 2; 
      break; 

     case '^': 
      weight = 3; 
     } 
     return weight; 
    } 

    public boolean hasHigherPrecedence(char operator1, char operator2) { 
     int op1 = getOperatorWeight(operator1); 
     int op2 = getOperatorWeight(operator2); 
     if (op1 == op2) { 
      if (isRightAssociative(operator1)) 
       return false; 
      else 
       return true; 
     } 
     return op1 > op2 ? true : false; 
    } 

    public boolean isRightAssociative(char op) { 
     if (op == '^') 
      return true; 
     return false; 
    } 
} 
+1

Что такое линия 32? – keshlam

+0

Советы? Научитесь использовать ваш отладчик и Google. – csmckelvey

+0

Я проголосовал за закрытие, потому что «Вопросы, требующие помощи по отладке (« почему этот код не работает? ») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. ясное заявление о проблеме не полезно для других читателей ». – bhspencer

ответ

-2

Модификатор доступа может препятствовать доступу к стеку программы. Изменение:

private Stack <Character> s; 

к:

protected Stack <Character> s; 

Подробнее here

+3

Не знаю, каким образом может возникнуть исключение NullPointerException. Должно возникнуть ошибка компилятора. –

0

Похоже, что вы объявляете частный член s, никогда ничего к нему и не назначать, а затем пытаться использовать его в выражениях как s.empty() и s.pop(). Если ничто не назначено на s, то это null, и попытка вызвать метод на нем приведет к исключению NullPointerException.

Для создания пустого стека, вы, вероятно, хотите изменить декларацию:

private Stack <Character> s = new Stack<Character>(); 
2

Чтобы исправить NPE инициализировать объекты. В отличие от C++, Stack<Character> s; эквивалентен Stack<Character> s = null;; не до Stack<Character> s = new Stack<>();!

Остерегайтесь == и !=не себя так, как можно было бы ожидать для боксировал объектов.

Character a = new Character('A'); 
Character aa = new Character('A'); 
System.out.println(a == aa); 

дает (правильный!) Ответ false.

Это различные объекты. Если вы хотите сравнить равенства, можно использовать:

System.out.println(a.equals(aa)); 
System.out.println((char)a==(char)aa); 

Первый использует явный метод для сравнения содержимого объекта. Второе исключает эту проблему, используя не-объектные примитивы, где равенство поразрядно, а не ссылочное равенство.

0

Прежде всего, у вас есть метод, похожий на конструктор:

public String PostfixtoInfix(String e) { 

попытаться изменить его на что-нибудь другое, например:

public String transform(String e) { 

Во-вторых, ваш s поле никогда не будет назначен стек , Положить

s = new Stack<Character>(); 

в ваш конструктор. Кроме того, new Character('a') != new Character('a'), потому что это обойдется автоматическим (посыпным кешем) боксом. Вместо этого используйте просто char s как pOpen и pClose.

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