Java栈异常:推入String值后后续元素变为null问题求助
嘿,我一眼就瞅出你代码里的两个关键问题,这就是为啥第一次push正常,后面的元素全变成null的原因:
问题1:循环条件写错了,导致原有元素没全复制
你原来的循环是:
for (int i = 0; i < stack.length - 1; i++ )
这个条件会让你少复制一个元素!举个例子:
- 当栈里已有1个元素时,
stack.length -1是0,循环根本不会执行,新数组里就没有原来的元素; - 当栈里有2个元素时,只会复制第一个元素,第二个直接丢了。
正确的循环条件应该是遍历所有原有元素,也就是i < stack.length。
问题2:没有把新元素放入新数组的末尾
你的代码写到tm...就断了,明显是漏了把要push的element放到新数组的最后位置。新数组的长度是size = stack.length +1,所以最后一个索引是size -1,必须加上tmpStack[size - 1] = element;,不然这个位置就是默认的null,看起来就像你push的元素变成了null。
修复后的完整代码
public void push(E element) { if (isEmpty()) { stack = (E[]) new Object[1]; stack[0] = element; } else { int size = stack.length + 1; E[] tmpStack = (E[]) new Object[size]; // 修复循环:复制所有原有元素到新数组 for (int i = 0; i < stack.length; i++) { tmpStack[i] = stack[i]; } // 将新元素放到新数组的最后一位 tmpStack[size - 1] = element; stack = tmpStack; } }
小优化建议
手动写循环复制元素有点麻烦,还容易出错,你可以用Java自带的System.arraycopy来替代循环,代码更简洁高效:
// 替换原来的for循环 System.arraycopy(stack, 0, tmpStack, 0, stack.length);
内容的提问来源于stack exchange,提问作者user8865807
相关产品推荐
相关产品推荐

