0

我正在实现一个带有两个堆栈的字符缓冲区。我正在使用 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 指针异常。这是我从 main 中调用它的方式:

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

所有这些都返回一个空异常。断言 Character 可以很好地到达方法内部。我使用了 java.util.Stack;当它失败时,我实现了自己的。但它仍然失败了。
我可能做错了什么?
任何形式的帮助表示赞赏!

4

3 回答 3

6

在构造函数中使用这些行:

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

您已经创建了与实例变量同名的局部变量,因此您还没有初始化实例变量stackLeftstackRight,因此 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 回答