2013-12-23 39 views
13

我剛遇到一些無法理解我的邏輯的東西。以下情況如何發生?Netbeans Java調試器聲稱((true && false)== true)

enter image description here

我已經嘗試了所有常用的方法來解決這個問題;清理/構建,重新啓動netbeans等,但問題仍然存在。無論我做什麼,變量complete總是如此。我甚至分別用truefalse替換leftright布爾值,但沒有更改。什麼工作,是重構重命名的變量,但當我改回原來的問題時,問題再次出現。沒有以同樣的方式命名的班級成員。

發生了什麼事?我終於失去了主意,或者該變量的值是否爲false

這是在Windows上的Netbeans 7.3.1。

Edit01

我會盡力證明給不信的人,這其實是發生的事情,當我進入我的工作電腦在一個星期左右。同時,請聽取我的意見。這不是惡果,也不是由於我缺乏Netbeans調試知識而發生的。

我確實記得在發生這種情況之前做了一堆svn switch-to-copy命令,但不是代碼駐留在(依賴項)中的項目。無論如何,清理/構建應該注意到任何不一致。我也不記得清除Netbeans緩存,我現在很遺憾。

Edit02

仇敵會討厭,但我擔心的一樣,回到我的工作站後,我再也不能重現此問題。它讓我不得不承認這一點,但我沒有證據證明這件事發生過。我所做的只是:將我的電腦從休眠狀態喚醒,取消了對變量的重構重命名,這是我在完成工作之前完成的最後一件事情,清潔/構建,然後是另一次調試運行。一切只是..工作。

+0

美麗,簡單美麗。 java不知道如何做布爾操作... –

+0

不,HighCore是正確的。該計劃相應地行爲不端,@ikegami。 – predi

+0

出於好奇,代碼是否輸入以下'if'塊? 'complete'是'true','context.isEmpty()'是'false'。 –

回答

3

我看到一對夫婦的可能性,但我不相信它是在JVM內部錯誤。調試器可能只是被欺騙或竊聽。

  1. 一些優化導致leftcomplete成爲堆棧上的相同的變量在引擎蓋下繼續。因此,這將大致意味着你的代碼優化,得到了這個:

    boolean left = (start <= offset); 
    boolean right = (stop + 1 >= offset); 
    left = left && right; // reused "left" instead of new variable "complete" 
    

    不過,據我所知,Java編譯不會做這樣的優化。如果這不是事實,有人可以確認或提供詳細信息嗎? (也許javac或JIT執行此操作嗎?)

  2. NetBeans調試器真的很麻煩。從我的C++調試經驗來看,實際上在調試器中存在一個錯誤(聽起來有趣,正確),導致調試器無法正確讀取內存中的整數值。有時結果是關閉的。在這種情況下,這並不意味着什麼,但實際上調試器可能有錯誤。

    我記得我一直在尋找幾個小時來修復我通過調試發現的代碼中的一個錯誤。但沒有錯誤。至少不在我的代碼中。調試器在內存中報告了一些值,但是錯誤的。

如果這種怪異的行爲總是發生,然後嘗試將調試語句背後:

System.out.println(left + " && " + right + " == " + complete); 

我敢打賭,輸出將是正確的。嘗試運行調試器也添加此行。如果這樣的優化發生,如我所述,它應該消失,因爲它不能再使用left

+0

最初的陳述是'boolean complete = start <= offset && stop + 1> = offset',這是一個錯誤的行爲。我分解了這個表達式,因爲我不明白它是如何返回true的。所以我不認爲1中的情況適用於我的問題。請注意,即使在我將其更改爲「boolean complete = true && false」和clean/build後,它仍然返回true。 – predi

+0

我之所以開始調試此代碼,是因爲我的程序以意想不到的方式行事異常。我幾乎可以肯定你的'系統。out「的行爲與調試器的行爲相同,因爲程序的流程(按照屏幕截圖中的內容)相應地發生了變化。但我無法確定。 – predi

+1

你不能把你的代碼打印語句看到結果嗎? –

-2

我複製你的代碼,這裏是我發現:

+15

輸出故意或部分陰謀中的「強迫性」拼寫錯誤? ;-) – haraldK