2017-05-07 8 views
0

プログラムで何をしたいか:スタックを作成し、HP12Cクラスのcalculateメソッドを使ってスタックを操作します。私はちょっと私は、Javaを使用するので、それはしばらくしているとあなたはそれで私を助けることができる場合、私は、オブジェクトを作成し、使用してトラブルを抱えているbecouseここで迷ってしまいましたNullPointerException JavaのRPNの例でスタックを使用する

...

ので、私が投稿最後の時間ここで人々は私があなたのために宿題を投稿するのを痛感していましたが、私はそれを心配していません。私が求めているように感じているのなら、あまりにも多く、ちょうど私が間違っていることについてのヒントを教えてください、多分私はそこから行くことができます。ありがとう。エラーの

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); 
    } 

} 

トレース:これは

String elements[] = null; 

ときと同じです

String elements[]; 

:LinkedStack以内

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-nullポイントの受け取りと方法-i-fix-it) – Logan

答えて

2

あなたは初期化されることはありませんフィールドを持っていますにアクセスしてくださいの場合、null参照を使用しているため、例外が発生します。

参照:How to initialize an array in Java?

は、あなたがあなたのスタックを初期化する場合、例えば、20個の要素、あなたはクラスのユーザーはスタックに20個の以上の要素をプッシュしようとする状況に対処する必要があることに注意してください。

基本配列をコピーしてサイズを2倍にするか、プリミティブ配列の代わりに自動サイズ変更データ構造like one of Java's List implementationsを使用することで、これを行うことができます。あなたの配列を初期化する必要が

+0

スタックから要素を削除するにはどうすればよいですか?私は{5、10、+}を持っており、その結果を25で計算します。どのように3つの要素を25に置き換えるのですか? 編集:それは実際にベクトルから削除していませんか? 「トップ」を変更するだけですか? –

+0

@EduardoVieiraこの質問で特定した問題を修正し、更新されたコードで新しい質問を投稿してください。 :) – Michael

0

:[?何NullPointerExceptionがある、と私はそれをどのように修正すればよい]の

String[] elements = new String[lengthOfYourArray]; 
関連する問題