2012-11-09 25 views
1

Eclipse對於編寫Java程序非常棒,但今天我發現,欺騙像我這樣的新編碼員是很棒的。 @ _ @eclipse的檢查功能讓我像個假人一樣,爲什麼在調試時看起來很棘手?

我寫的一個片段如下,

public static void main(String[] args) { 
    for(int i=0;i<3;i++){ 
     System.out.println("i = " + i); 
    } 
} 

然後我在的行添加一個斷點「......是System.out.print」,單擊「調試」按鈕,進入月食到「調試」的角度並突出顯示斷點行,然後將光標移到變量「i」上,其值爲「0」。然後,我選擇「i ++」,然後單擊「檢查」(或按「Ctrl + Shift + I」)一次,將光標移動到變量「i」上,將其值更改爲「1」。我再次重複「檢查」,我的值變爲「2」......(每次點擊「檢查」時,它的值將加1)!

爲什麼會發生這種情況!?我只想看看調試propuse的「我」的價值,不想真正改變它的價值,直到我進入下一個陳述。我認爲「檢查」以及「顯示」僅用於查看變量/表達式,它們不應該影響該值,但在這種情況下,它並不像我所期望的那樣工作。

誰能告訴我哪裏出了問題?

My eclipse version info: 
Version: Indigo Service Release 2 
Build id: 20120216-1857 

Select "i++" and click "Inspect"

回答

3

如果您檢查一個表達式,日蝕來執行表達這樣你就可以得到價值。因此,如果你檢查i++,eclipse會增加一個到i

想想這樣:如果不是i ++,你檢查了myFunction(i),你會期望eclipse執行函數「myFunction」來獲取值嗎?這與i++一樣。

+0

是的,它的行爲你說什麼,我預計它僅分析「我++」表達一個隔離區域,並返回我的價值,而不是影響的實際價值的「i」,「顯示」,似乎行爲相同作爲「檢查」的方式。 – vicd

+0

@vicd但是爲了評估一個孤立區域中的表達式,eclipse可能會被迫複製很多可能被改變的值,例如,如果調用一個函數,幾乎所有的變量都可能被改變。 – Pablo

+0

em,似乎我們需要注意在表達式和方法上使用「Inspect」/「Display」,因爲它可能會導致副作用,這是我們不想要的。例如,如果一個方法「int deposit()」加上用戶銀行賬戶餘額並返回當前餘額,當我「檢查」兩次時,這將加上餘額兩次!換句話說,如果使用不當,「檢查」是危險的。請糾正我,如果我錯了,謝謝。 – vicd

1

在eclipse中,如果你檢查一個表達式,然後eclipse執行該表達式並給出結果。
所以在你的情況下,如果你檢查i++然後日食執行它並增加值i。儘可能多的時候,這會增加值i

+0

以我的觀點來看,這不是很友善。我只希望它評估價值並將其返還給我,而不是更改變量的價值。 – vicd

1

如果您在調試過程中擔心顯示/顯示值,並且您確定不會影響該值,則應該選擇變量或表達式並使用「Watch」選項。

這將跟蹤變量/表達式值而不執行,只是每次運行時更新新值。我認爲這是最安全的方式。

+1

感謝您的建議,我經常用手錶來檢查變量的值。我通常在調試的「表達式」選項卡中添加變量,並且它對於監控非常方便。另外,你是否發現「手錶」也像「檢查」/「顯示」一樣,每當你點擊一個表達式時,它都會影響到變量的實際值。 – vicd

+1

因此,在這種情況下,我認爲它充滿了調試技巧:-),當我剛接觸它時,很容易使我感到困惑。 – vicd

0

正如Pablo提到的那樣,它必須評估代碼才能告訴你它返回的值。你可以把手錶放在「i + 1」上,這會給你想要的價值,而不會產生你不想要的副作用。

基本上,您需要注意任何啓動的任何副作用,無論是從「主」代碼還是從調試工具。正如Erhannis所說,在調試代碼時修改數值時,這個功能非常有用。 (例如,您可以在實際調整代碼之前驗證調整/修復確實有幫助。)

您曾期待過「隔離區」,但這樣做非常困難,特別是在面向對象的環境中許多對象鏈接到許多其他對象。平行運行整個事件有時可能會奏效,但是你會失去上面的調整能力。在任何情況下,你都會遇到大量的資源爭奪問題;例如這兩個副本都試圖讀取/寫入諸如日誌文件之類的特定文件。另外,這兩個執行路徑可能會發生偏差,導致不正確的/誤導性的值。

因此,預防這種副作用是不是真的在這裏一個可行的選擇,很少會是有用的反正。只要期望手錶既可以反映又可以影響代碼執行。

相關問題