2016-11-23 2 views
-2

Ich habe den ganzen Tag daran gearbeitet, es scheint einen Kompilierungsfehler zu geben. Ich brauche es, um arithmetische Ausdrücke auszugeben: hat passende Symbole, wenn {25 + (3 - 6) * 8} die Ausgabe ist (es tut dies richtig), aber wenn ich eine nicht übereinstimmende eingabe wie} {25 + (3 - 6) I eine Exception in thread "main" java.util.EmptyStackException Fehler erhaltenJava-Matching-Klammer

import java.util.*; 

public class Comparison { 

public static void main(String[] args) { 
    Stack<Character> stack = new Stack<>(); 



     System.out.print("Please enter arithmetic expression: For example, the expression {25 + (3 – 6) * 8} "); 
     Scanner input = new Scanner(System.in); 


     String capture = input.nextLine(); 
//   String[] pieces = capture.split("\\s+"); 
     for (int i = 0; i < capture.length(); i++) { 
      char p = capture.charAt(i); 
      if (p == '{' || p == '(' || p == '[') { 
       stack.push(p); 
      } 
      char r = stack.peek(); 
    if (p == '}' || p == ')' || p == ']') 
    { 

     if (p == '}' && r == '{' || p == ')' && r == '(' || p == ']' && r == '['){ 
      stack.pop(); 
     System.out.print("Arithmetic Expression: has matched symbols."); 
     } 

       else { 
     System.out.print("Arithmetic Expression: has mismatched symbols."); 

       } 


     } 


    } 



} 


    } 
+0

Die Fehlermeldung macht sehr viel Sinn ... Es ist äquivalent zu einem 'NullPointerExcepion' in dem Sinne, dass nichts auf dem Stapel existiert, aber Sie versuchen, eine Lese-/Pop-Operation darauf auszuführen. Sie können diese Ausnahme "versuchen-fangen" und auf dem "catch" wissen Sie, dass die Eingabe schlecht ist, weil sie keine korrekt eingeschlossenen Klammern enthält. – px06

Antwort

0

Sie müssen überprüfen, ob Stapel derzeit leer an diesem Punkt ist:

if (stack.size()==0){ 
    // message when the stack is empty: parenthesis not closed 
    break; 
} 
char r = stack.peek(); 
if (p == '}' || p == ')' || p == ']') 
{ 

    if (p == '}' && r == '{' || p == ')' && r == '(' || p == ']' && r == '['){ 
     stack.pop(); 
    System.out.print("Arithmetic Expression: has matched symbols."); 
    } 

      else { 
    System.out.print("Arithmetic Expression: has mismatched symbols."); 

      } 


    } 


} 
+0

Arbeitete wie ein Charme. Vielen Dank – JavaCompilexx

0

I Während POPING nur eine Änderung vorschlagen wird

wie

if (p == '}' & & r == '{' || p == ')' & & r == '(' || p == ']' & & r == '[' & & stack.size()> 0)

das ist, es!