这是翻转链表的一段程序,明明这段程序中函数的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; // 加上最后这句话会报错。
}
}
黄舟2017-04-17 14:22:01
原因很簡單,因為對於第一個:其中的curr這個值是有可能是null的,因為在初始化ListNode的時候可能會由於各種問題而內存不能申請成功(比如此時沒有可用的內存了),所以這個while是有可能會退出的,也就有可能會執行到後面去,所以必須要有return
而第二個:你已經顯示的指明了while中的值是true,所以,顯然不可能會執行到後面
還有一種解釋就是這個是與你的編譯器有關,while(true)是編譯器能偵測到的範圍,而while(curr != null)是無法在編譯階段偵測出來的,也就是編譯器並不能判斷是不是會執行到最後。 。