2012-08-24 88 views
-2

我在Java中遇到了這個函數的問題。我不明白爲什麼當lastNodeAttributes==null是真時,執行跳轉到return null;應該,但在此之後,而不是從函數返回它直接跳到return fight...;在最後。爲什麼第一次返回不退出,但執行跳轉到第二個條件部分返回?這怎麼可能?請解釋原因顯然我不明白如何基本的Java工作。爲什麼返回不能在Java中退出函數?

public Node undo() { 
    Node lastNode=fight.getLastChild(); 
    NamedNodeMap lastNodeAttributes = lastNode.getAttributes(); 
    if(lastNodeAttributes == null) { return null; } 
    else { 
     String lastNodeFighter = lastNodeAttributes.getNamedItem("fighter") 
           .getNodeValue(); 
     String lastNodePoints = lastNodeAttributes.getNamedItem("points") 
           .getNodeValue(); 
     if(Integer.parseInt(lastNodeFighter) == 1) { 
      fighter1score-=Integer.parseInt(lastNodePoints);  
     } 
     else { fighter2score -= Integer.parseInt(lastNodePoints); } 
     return fight.removeChild(fight.getLastChild()); 
    } 
} 
+1

問題標題不匹配問題??? –

+1

*「這怎麼可能?」* =>不是。 – assylias

+0

我很肯定你在你的問題上做出了肯定,這是錯誤的。請使用調試器進行驗證。 –

回答

0

你所描述的是不可能的。迴歸聲明確實總是返回所述內容。還有,爲什麼你可能會看到此行爲在調試器

  • 你不會調試你認爲你正在調試代碼的一些可能性。調試器可能會加載與您想象的不同的類。嘗試清理並重新編譯您的代碼並再次調試。
  • 代碼以發佈模式編譯,並且已經切換了您的語句。使用優化代碼在發佈模式下進行調試有時會拋出調試器,以便在調試器中執行的錯誤語句顯示爲與實際執行的錯誤語句相同。你確定你正在調試的代碼是未優化的嗎?
  • 如果您沒有仔細考慮,線程問題也會導致奇怪的跳轉。如果兩個return語句和多個線程都有斷點,那麼一個線程可能會觸發第一個返回,然後另一個線程可能會觸發第二個返回。這沒有錯,只是調試多線程應用程序的工作方式。

檢查實際返回值還將確認確實只有一個return語句已執行。通過在呼叫者而不是被呼叫者處放置斷點來完成此操作。

+0

那麼,我檢查了返回值,確實如預期的那樣返回null,Eclipse中的調試器仍然顯示執行跳轉到第二個返回值。非常混亂,我一直在調試這一段時間,但仍然不知道爲什麼調試器的行爲像它一樣。無論如何,返回值是正確的,儘管如此謝謝你的建議。 – spirytus

0

開始調試您的應用程序。一個很好的調試教程可以在這裏找到:http://www.vogella.com/articles/EclipseDebugging/article.html

驗證,lastNodeAttributes是真的爲空。還要檢查,如果方法可能執行了兩次,第一種情況下lastNodeAttributes爲空,第二種情況不是。

-1

返回確實會退出該方法。檢查你使用的是最新編譯的類。 嘗試做一個乾淨的構建。 從第一行開始調試,確保您沒有運行兩次相同的方法。 如有疑問,請在課程開始處添加system.out以確保您檢查的是正確的課程版本

+0

至少說你爲什麼downvote。我看不到它的理由 – IvoC

相關問題