0

2 つのスタックを持つ Character Buffer を実装しています。insert() メソッドで要素を挿入しています:

class Buffer
{
    private Stack<Character> stackLeft;
    private Stack<Character> stackRight;
    private int size;

    Buffer()
    {
        Stack<Character> stackLeft   = new Stack<Character>();
        Stack<Character> stackRight  = new Stack<Character>();
        size = 0;
    }

    public void insert(char c)
    {
        size ++;
        stackLeft.push(c); //This line returns NullPointerException
    }
}

c 文字変数をプッシュしようとするたびに、Null ポインター例外がスローされます。メインから呼び出す方法は次のとおりです。

public static void main(String[] args)
{
    Buffer tb = new Buffer();

    Character ch = new Character('a');
    tb.insert(ch);
    tb.insert(new Character('a'));
    tb.insert('a');
}

これらはすべて null 例外を返します。Character がメソッド内に到達すると主張しました。私は java.util.Stack; を使用しました。失敗したときは、自分で実装しました。しかし、それでも失敗しました。
私は何が間違っているのでしょうか?
どんな種類の助けも大歓迎です!

4

3 に答える 3

6

コンストラクターで次の行を使用します。

Stack<Character> stackLeft   = new Stack<Character>();
Stack<Character> stackRight  = new Stack<Character>();

インスタンス変数と同じ名前のローカル変数を作成したため、インスタンス変数stackLeftおよび を初期化していないstackRightため、Java はそれらを に初期化しますnull

名前がインスタンス変数に解決されるように、型を削除します。

stackLeft   = new Stack<Character>();
stackRight  = new Stack<Character>();
于 2013-10-29T17:14:55.287 に答える
1
Buffer()
{
    Stack<Character> stackLeft   = new Stack<Character>();
    Stack<Character> stackRight  = new Stack<Character>();
    size = 0;
}

これをに変更する必要があります

Buffer()
{
    stackLeft   = new Stack<Character>();
    stackRight  = new Stack<Character>();
    size = 0;
}

クラスフィールドをインスタンス化するのではなく、Buffer() コンストラクターで新しいローカル変数を作成していると考えられます。

于 2013-10-29T17:17:21.560 に答える
0

これは、コンストラクターBuffer()がクラス変数を設定せず、独自のローカル変数 (stackLeft、stackRight) を作成して初期化するためです。

これを変える::

class Buffer
{
    private Stack<Character> stackLeft;
    private Stack<Character> stackRight;
    private int size;

    Buffer()
    {
        stackLeft   = new Stack<Character>();
        stackRight  = new Stack<Character>();
        size = 0;
    }

    public void insert(char c)
    {
        size ++;
        stackLeft.push(c); //This line returns NullPointerException
    }
}
于 2013-10-29T17:15:05.443 に答える