Java Stack push方法NullPointerException

时间:2013-10-29 17:13:25

标签: java nullpointerexception stack character

我正在实现一个带有两个堆栈的字符缓冲区。我正在使用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');
}

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

3 个答案:

答案 0 :(得分:6)

在构造函数中使用以下行:

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

您创建了与实例变量名称相同的局部变量,因此您尚未初始化实例变量stackLeftstackRight,因此Java会将它们初始化为null。< / p>

删除类型,以便名称将解析为实例变量。

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

答案 1 :(得分: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()构造函数中创建新的局部变量,而不是实例化类字段;

答案 2 :(得分: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
    }
}