2017-05-07 29 views
0

我想讓程序執行以下操作:創建堆棧並使用HP12C類中的calculate方法對其進行處理。在Java中的RPN示例中使用堆棧的NullPointerException

我有點失去了這裏becouse它已經有一段時間,因爲我用Java和我有麻煩創建和使用的對象,如果你能幫助我與...

自從上次我貼在這裏,人們正在幫我發佈我的作業給你做,我不想那麼做。如果你覺得我所要求的太多了,只要給我一個小費,說明我做錯了什麼,也許我可以從那裏開始。謝謝。

public interface Stack { 

    public void push(String element); 

    public String pop(); 

    public int size(); 

    public String peek(); 
} 


public class LinkedStack implements Stack { 

    String elements[]; 
    int top; 

    @Override 
    public void push(String element) { 
     top++; 
     elements[top] = element; 
    } 

    @Override 
    public String pop() { 
     String element; 
     element = elements[top]; 
     top--; 
     return element; 
    } 

    @Override 
    public int size() { 
     return 0; 
    } 

    @Override 
    public String peek() { 
     return null; 
    } 

} 



public class HP12C { 
    public Stack stack; 

    public HP12C() { 
     stack = new LinkedStack(); 
    } 

    public double calculate(String line) { 
     String n, n1, n2; 
     double d = 0, d1 = 0, d2 = 0; 
     // Quebrar a linha nos parametros 
     String elements[] = line.split(" "); 

     // Empilhar e calcular 
     for (String e : elements) { 
      // Distinguir o que eh operador e o que nao eh 
      switch (e) { 
      case "+": 
       n1 = stack.pop(); 
       d1 = Double.parseDouble(n1); 
       n2 = stack.pop(); 
       d2 = Double.parseDouble(n2); 
       d = d1 + d2; 
       n = String.valueOf(d); 
       stack.push(n); 
       break; 
      case "-": 
       n1 = stack.pop(); 
       d1 = Double.parseDouble(n1); 
       n2 = stack.pop(); 
       d2 = Double.parseDouble(n2); 
       d = d1 - d2; 
       n = String.valueOf(d); 
       stack.push(n); 
       break; 
      case "*": 
       n1 = stack.pop(); 
       d1 = Double.parseDouble(n1); 
       n2 = stack.pop(); 
       d2 = Double.parseDouble(n2); 
       d = d1 * d2; 
       n = String.valueOf(d); 
       stack.push(n); 
       break; 
      case "/": 
       n1 = stack.pop(); 
       d1 = Double.parseDouble(n1); 
       n2 = stack.pop(); 
       d2 = Double.parseDouble(n2); 
       d = d1/d2; 
       n = String.valueOf(d); 
       stack.push(n); 
       break; 
      default: 
       stack.push(e); 
       break; 
      } 
      stack.push(e); 
     } 

     return -1; 
    } 
} 

import static org.junit.Assert.*; 

import org.junit.Test; 

public class HP12CTest { 

    @Test 
    public void testSimple() { 
     HP12C hp = new HP12C(); 
     double result = hp.calculate("10 15 +"); 

     assertEquals(25, result, 0); 
    } 

} 

跟蹤誤差:

java.lang.NullPointerException 
    at LinkedStack.push(LinkedStack.java:9) 
    at HP12C.calculate(HP12C.java:55) 
    at HP12CTest.testSimple(HP12CTest.java:10) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
+1

的可能的複製(http://stackoverflow.com/questions/218384/what-is -a-nullpointerexception-and-how-do-i-fix-it) – Logan

回答

2

在LinkedStack你有永遠不會初始化一個字段:

String elements[]; 

這相當於

String elements[] = null; 

當你嘗試訪問elements[top],你這樣做的空引用,導致你的異常。

參見:How to initialize an array in Java?

請注意,如果你初始化你的棧,例如,20元,那麼你將需要處理,其中類的用戶試圖推超過20個元素堆棧情況。

您可以通過複製底層數組並將其大小加倍來實現此目的,或者您可以使用自動調整大小的數據結構like one of Java's List implementations而不是基元數組。

+0

如何從堆棧中刪除元素?像,我有{5,10,+},打電話計算結果在25,我該如何替換25個3個元素? 編輯:我真的不會從矢量中刪除它?只需更改「頂部」? –

+0

@EduardoVieira修復您在此問題中發現的問題,並使用您的更新代碼發佈新問題。 :) – Michael

0

你必須初始化數組:什麼是一個NullPointerException,以及如何解決呢]

String[] elements = new String[lengthOfYourArray];