【问题标题】:How exactly node == null checks if the stack is full? [closed]node == null 如何检查堆栈是否已满? [关闭]
【发布时间】: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


【解决方案1】:

简单地说,你引用的代码不是很好。 :-)

如 cmets 中所述,您在此处发布的 Java 代码永远不会通过 if 检查,因为如果在进行分配时没有内存,代码将生成 OutOfMemoryError 而不是留下引用空值。链接的 C++ 代码也不能触发 if 语句,因为在 C++ 中,如果 new 内存不足,则会引发 std::bad_alloc 异常。

【讨论】:

    猜你喜欢
    • 2012-06-20
    • 2012-12-28
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多