簡體   English   中英

Netbeans Java Debugger聲稱((true && false)== true)

[英]Netbeans Java Debugger claims that ((true && false) == true)

我剛遇到的東西違背了我對邏輯的理解。 下面的情況如何發生?

在此輸入圖像描述

我已經嘗試了所有常用的方法來解決這個問題; 清理/構建,重新啟動netbeans等,但問題仍然存在。 可變complete始終是真實的,不管我做什么。 我甚至分別用truefalse布爾值替換了leftright ,但沒有改變。 什么工作,是變量的重構重命名,但當我把它改回原來,問題重新浮出水面。 沒有以相同方式命名的類成員。

這是怎么回事? 我最終失去了理智,或者該變量的值是否為false

這是Windows上的Netbeans 7.3.1。

Edit01

當我在一周左右的時間內訪問我的工作計算機時,我會嘗試向不信的人證明這是實際發生的事情。 同時,請接受我的話。 這不是一個惡作劇,也不是因為我缺乏Netbeans調試知識而發生的。

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

Edit02

仇恨者會討厭,但正如我擔心的那樣,在回到我的工作站后,我再也無法重現這個問題了。 我很生氣地承認這一點,但我沒有證據證明這件事曾經發生過。 我所做的就是:從休眠狀態喚醒我的電腦,解除我的變量的重構重命名,這是我在完成工作之前做的最后一件事,一個干凈/構建,然后是另一個調試運行。 一切都只是......工作。

我看到了幾種可能性,但我不相信它在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了。

我復制了你的代碼,這是我發現的:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM