java为什么明明知道这句话不会被执行,但为什么却一定要加上这句话。


这是翻转链表的一段程序,明明这段程序中函数的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;  // 加上最后这句话会报错。
    }
}

java debug 编译器

奈良原一铁 9 years, 2 months ago

原因很简单,因为对于第一个:其中的curr这个值是有可能是null的,因为在初始化ListNode的时候可能会由于各种问题而内存不能申请成功(比如此时没有可用的内存了),所以这个while是有可能会退出的,也就有可能会执行到后面去,所以必须要有return

而第二个:你已经显示的指明了while中的值是true,所以,显然不可能会执行到后面

还有一种解释就是这个是与你的编译器有关,while(true)是编译器能检测到的范围,而while(curr != null)是不能在编译阶段检测出来的,也就是编译器并不能判断是不是会执行到最后。。

冬夜的无奈 answered 9 years, 2 months ago

先说第二个:
clipboard.png

编译时报错的消息为: 不可能到达的语句块 .
原因是因为 while 中 的条件为 true , 即这个循环会一直进行下去(因为没有检测到 break 可以中断 while 让流程往下走下去, 所以 whlie 后面的语句就变成永远不可能被执行到的了).

再说第一个:

clipboard.png

报错的原因为: 缺少return语句 .
依据为: while 中的条件可以为假(导致 while 结束), 而这个函数声明的返回值为 ListNode , 但 while 结束之后没有返回值, 所以报错.

PS:编译器还没有聪明到可以像人一样(或者说还没有实现), 根据你的代码来决定 while 循环的可能性, 它只是简单的根据使用 while 时给定的条件来进行编译.

beowulf answered 9 years, 2 months ago

Your Answer