2013-06-05 26 views
2
public static void main(String args[]) 
{ 
    if(true) 
    { 
     int x= 3*44+7; 
     //int y=1; 
    } 
} 

我縮小了我的問題到這個簡單的語句,我真的不知道如何在eclipse調試器中訪問這個變量。它總是發生在變量被聲明爲if條件,try-catch語句,循環等的情況下,並且意外地是該塊中的最後一條語句。在Eclipse中調試最後一條語句是不可能的?

爲了解決這個問題,我停止了我的調試會話,爲該塊添加另一個語句,重做我剛做的所有事情。有更好的解決方案嗎?

+3

我是一個視覺工作室/ .NET的人,當調試大括號被認爲是聲明的最後一步。太糟糕了,它不是在Java/Eclipse的情況下顯然 –

+0

也見方法斷點重複SO問題:http://stackoverflow.com/questions/7785887/cant-breakpoint-the-last-statement-of-a-code-block -in-eclipse – Stefan

回答

1

在您的情況下,編譯器可能實際上刪除了作業的變量x不會在以後使用。

反正......你可以在你的調試器中使用的一種解決方法(假設你想調試的語句不是狀態改變)就是使用剪貼簿,或者使用檢查。

http://www.ibm.com/developerworks/library/os-ecbug/圖7和圖8

可以突出一個表達式(聲明或整個語句的一部分),並檢查我相信。 (幾個月內沒有使用過月食)。另一種方法是停下來(在表達式觸發前),然後將行復制到顯示視圖中,然後在那裏運行。

它將在當前的堆棧幀內運行,因此所有本地對象都可用。但是,運行集和其他狀態改變調用實際上會改變程序的狀態。 (這不是理想的,但它跳動停止調試器)

+0

使用你在鏈接中提到的Display解決了我的問題,我並不知道在eclipse中存在一個窗口來執行即時代碼,並且使用該窗口可以避免重新啓動我的整個應用程序來添加虛擬行! –

2

你是對的,很難看出最後一條語句的價值:當你傳遞最後一行時,程序終止。

解決方法可以是在此語句之後添加虛擬行,並在其中放置斷點或使用「表達式」視圖並在其中放置x(即3*44+7)的表達式。

請注意,在現實世界中,這並不是典型的情況,在這種情況下,程序比1個可執行文件行長一點。 :)

+2

它與一行無關..它必須處理任何塊的最後一行 –

+0

@MC在塊的最後一行聲明的變量永遠不會生效。 'int x = 3 * 44 + 7;'因爲塊的最後一行沒有副作用,並且結果是死的,所以執行它會浪費處理器週期。 –

+0

@PatriciaShanahan這是一個很好的觀點,但作爲一個調試器(er),我希望這個語句被執行用於調試目的。正如先前所評論的,VS似乎考慮到了這一點。 –

2

最後的「聲明」運行,它只是你不能看到變量的結果,因爲:

  1. 變量不此語句前存在。

  2. 當語句正在執行時變量不存在 - 最後一步是將結果值賦給變量。

  3. 該變量將存在於下一行,但該行結束變量聲明的範圍,因此該變量不再存在。

在一個更 「現實世界」 的例子,你可以做這樣的事情 -

變化:

public int doIt() { 
    return 3*44+7; 
} 

要:

public int doIt() { 
    int x = 3*44+7; 
    return x; 
} 

,並設置斷點'返回'線。

+0

在eclipse中,另一個選項是將操作添加到「表達式」視圖中(在調試時選擇編輯器中的代碼,然後右鍵單擊並選擇「監視」 –

+0

@Pablo表達式視圖是一個有用的視圖,對我不熟悉,但不幸的是它並沒有解決這個問題 –

1

我看不到您的問題的任何解決方案。 由於您只能看到在當前行之前定義的變量,因此在變量聲明後顯然需要一個語句。 如果沒有聲明,你的變量不再處於當前範圍(在你的情況下,你的程序結束),因此不能被查詢。

順便說一句,你說你停止了你的調試會話。使用HotSwap,您可以動態替換當前方法的代碼,並在方法開始時重新開始調試(請參閱調試器中的'Drop to frame')

+0

Drop Frame是一個我不知道的有用功能,但是我無法添加額外的語句,而且我讀了它並不允許一切都被改變。可能沒有解決方案 –

相關問題