【问题标题】:Condition always true when reached in while loop在 while 循环中达到条件时始终为真
【发布时间】:2014-07-29 05:18:05
【问题描述】:

我创建了一个方法来在排序(递增)链表的正确位置插入一个链表节点,但我遇到了一些问题。

public static void sortedInsert(LinkedListNode root, int value) {
        LinkedListNode newNode = new LinkedListNode(value);
        if (root == null || root.data >= value) {
            newNode.next = root;
        } else {
            LinkedListNode curr = root;
            while (curr.next.data < value && curr.next != null) {
                curr = curr.next;
            }
            newNode.next = curr.next;
            curr.next = newNode;
        }
    }

错误:

Exception in thread "main" java.lang.NullPointerException
    at LinkedLists.LinkedListProblems.sortedInsert(LinkedListProblems.java:188)

curr.next != null 部分在 intellij 中突出显示,因此我假设这是导致错误的原因。只有当我添加的值大于排序链表的最后一个值时才会出现此错误

但是当迭代到链表的最后一个节点并且该节点的值仍然小于参数的值时。那不应该退出while循环吗?

【问题讨论】:

  • 您的while-loop 条件不应该颠倒吗? while (curr.next != null &amp;&amp; ...) 这样当它是 null 时,您不会尝试检查它的数据....这会导致 NPE?

标签: java linked-list


【解决方案1】:

我认为问题出在这里

while (curr.next.data < value && curr.next != null) {
  curr = curr.next;
}

你测试顺序不对,先检查null -

while (curr.next != null && curr.next.data < value) {
  curr = curr.next;
}

否则,当curr.nextnull 时,它已经测试了curr.next.data &lt; value,这将抛出NullPointerException

【讨论】:

    【解决方案2】:

    因为cur.next.datacur.next!=null 之前进行了测试,所以您在该行上遇到了异常。

    交换它们,&amp;&amp; 将正确短路,避免异常。

    【讨论】:

      【解决方案3】:

      看起来您的第一个 if 应该是 != null,并且应该是 &&,否则即使 root 为 null,您也可以评估 root.data。

      if (root != null && root.data >= value) {
      

      【讨论】:

      • 应该是 && 不是 ||
      猜你喜欢
      • 2014-03-25
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多