2013-05-02 94 views
-1

我已經得到的數據結構如下:檢查空進入無限循環

[對象] - > [對象] - > [對象]

每個對象具有右指針到另一個。

while (currentParcel.getRight() != null) { 
    currentParcel = currentParcel.getRight(); 
} 

此代碼進入無限循環。

按照我的邏輯,它應該儘可能地正確,只有當它到達null時,currentParcel對象應該是指向null的最後一個對象(沒有對象到右邊)。

我該如何解決無限循環?

我試着寫它在以下方式:

boolean found = false; 
try { 
    while (found == false) { 
     currentParcel = currentParcel.getRight(); 

     if (currentParcel.getRight() == null) 
     { 
      currentParcel.addRight(p); 
      System.out.println(currentParcel); 
      found = true; 
     } 

    } 
} 
catch (NullPointerException e) {} 

但它沒有爲我工作。它根本沒有儘可能地向右轉。

+0

你是否檢查過鏈接列表本身?你可能有一個循環鏈表。此外,你永遠不應該抓到一個NPE。 – 2013-05-02 22:51:30

+0

當然不是循環的。我在這裏沒有使用鏈表。簡單實現上面描述的對象中的數據結構。 – 2013-05-02 22:56:04

+0

您可能沒有使用核心Java LinkedList類,但是您已經創建了自己的鏈接列表數據結構,並且在您說「它不是肯定的循環」之前,最好檢查它。在你掌握瞭解決方案之前,不要忽視任何可能的問題原因。 – 2013-05-02 22:57:28

回答

0

你的循環是正常的,問題是其他地方,這工作正常

Parcel p1 = new Parcel(); 
    Parcel p2 = new Parcel(); 
    Parcel p3 = new Parcel(); 
    p1.setRight(p2); 
    p2.setRight(p3); 
    Parcel currentParcel = p1; 
    while (currentParcel.getRight() != null) { 
     currentParcel = currentParcel.getRight(); 
    } 
1

你有你的鏈表結構的圓形鏈接。要調試它,可以使用調試器或者在while循環中打印對象來查看它們是什麼。這樣你會發現問題。確保你的對象有一個體面的toString()方法,並在循環內部打印出來,以確定你的循環連接。此外,您不必爲此發生「最後一點」,但您需要的僅僅是在某處存在循環連接。你最好找到它。

+0

問題是我的結構中只有一個對象。當我嘗試添加另一個時,它應該找到最正確的對象並添加指向新對象的指針。第一個對象被添加,但是另一個不是。它被卡在這個循環中。 toString方法也只在列表中顯示一個對象。 – 2013-05-02 23:22:18

+0

@Lythium:考慮創建併發佈一個[sscce](http://sscce.org),一個我們可以編譯和運行的小程序,它使用代碼的核心並重現您的問題。如果你嘗試這種做法,你很可能會在問題孤立的時候看到問題。 – 2013-05-02 23:36:53