我正在实现一个带有两个堆栈的字符缓冲区。我正在使用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;当它失败时,我实现了自己的。但它仍然失败。
我怎么可能做错了?
任何形式的帮助表示赞赏!
答案 0 :(得分:6)
在构造函数中使用以下行:
Stack<Character> stackLeft = new Stack<Character>();
Stack<Character> stackRight = new Stack<Character>();
您创建了与实例变量名称相同的局部变量,因此您尚未初始化实例变量stackLeft
和stackRight
,因此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
}
}