debug - java为什么明明知道这句话不会被执行,但为什么却一定要加上这句话。
PHP中文网
PHP中文网 2017-04-17 14:20:01
0
1
674

这是翻转链表的一段程序,明明这段程序中函数的return一定会是循环体中的if语句中结束,然后return,根本都不会执行到正常结束循环,然后执行最后一句return语句。但是似乎最后一句return语句还必须加上,。java为什么要设计成这样?

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null) return null;

        ListNode pre = null;
        ListNode curr = head;
        while(curr != null){
            if (curr.next == null){
                curr.next = pre;
                return curr;
            } 
            ListNode next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return curr;
    }
}

但是下面这段程序却又不用最后加上一句return语句,而且加上最后一句return反而会报错。说是最后一句语句无法执行不到。java的编译器倒是怎么搞的。

public class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null) return null;
        ListNode pre = null;
        ListNode curr = head;
        while(true){
            if (curr.next == null){
                curr.next = pre;
                return curr;
            } 
            ListNode next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return curr;  // 加上最后这句话会报错。
    }
}
PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(1)
黄舟

理由は非常に簡単です。最初の理由は、ListNode の初期化時に、さまざまな問題 (たとえば、この時点で利用可能なメモリがないなど) が原因でメモリ アプリケーションが成功しない可能性があるため、curr の値が null になる可能性があるためです。 time ) なので、この while は終了する可能性があり、後で実行される可能性があるため、 return が必要です

2 つ目: while の値が true であることが明確に示されているため、最後まで実行することは明らかに不可能です

もう 1 つの説明は、これはコンパイラに関連しているというものです。while (true) はコンパイラが検出できる範囲ですが、while (curr != null) はコンパイル段階では検出できません。つまり、プロセッサはコンパイルできません。最後まで実行するかどうかを決定します。 。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート