【发布时间】:2021-06-30 09:25:48
【问题描述】:
如果我们创建的新节点为空(什么都没有),它怎么不将堆栈称为空,而是检查堆栈是否已满?
//push() function
public void push(int x) {
//create a new node and allocate memory
Node node = new Node();
//check if the stack is full i.e check for stack overflow
if(node == null) {
System.out.println("\n Stack is full. Stack Overflow!");
return;
}
node.data = x;
node.next = head;
head = node;
}
//check for an empty stack
public boolean isEmpty() {
return head == null;
}
【问题讨论】:
-
if(node == null)检查是无用的,永远不会是真的。当内存已满时,会出现错误提示。 -
编写此代码的人可能(错误地)认为如果堆栈已满,
new Node()将不会被执行(?)因此node将保持为空,但事实并非如此。如果堆栈已满,将抛出StackOverflowError。 -
另外,新变量是在堆中创建的,而不是在堆栈内存中。如果内存已满,您将得到的错误是“线程“主”java.lang.OutOfMemoryError:Java 堆空间中的异常”
-
那么,您的意思是该语句实际上检查内存是否已满,而不是堆栈溢出?
-
@KalashBabuAcharya 否。如果无法创建新节点,您将获得异常而不是返回 null。所以对 null 的检查没有任何作用,并且可以隐藏真正的问题。
标签: java data-structures stack stack-overflow