2010-01-22 63 views
5

是否有可能設置一個斷點,使程序停止的指令,取得了一定的條件後true執行?非線相依條件斷點

一個類有一個名爲currency的變量,我想製作一個斷點以使程序在currency == 20之後的任何一行停止。我不知道currency被更改的行號,所以這就好像在我的班級的每行 [0128]中設置了一個斷點currency得到改變]。

有沒有辦法來實現這一目標(除了在每一行添加一個斷點)?

我正在使用NetBeans,但歡迎使用任何其他IDE中的解決方案。

+0

我用過的舊調試器叫做'手錶'。你可能會嘗試搜索? – 2010-01-22 17:40:31

回答

3

這裏是一個在NetBeans中設置條件斷點鏈接:http://www.java-hair.com/?p=61

相關的文字:

在NetBeans中,創建一個斷點時, 右擊粉紅色的小廣場 一個表示打破。點擊 「自定義」。當自定義對話框 出現時,請檢查「條件」並在條件中填寫 。以上是NetBeans中此對話框的示例 。

,還包括Eclipse和JDeveloper中。

編輯:響應您的評論 - 不,這不能做你想要的方式。調試器設置斷點的方式是更改指令中設置斷點的字節。當評估指令時,該字節的存在將控制權轉交給調試器,調試器將該字節替換爲之前的任何內容。當執行恢復時,調試器將指令指針移動到設置斷點的指令處。

一條線上的條件斷點很容易實現 - 當控制轉移到調試器時,他只是檢查條件,如果它不是真的,那麼他會自動恢復執行。

那麼,它將如何,如果你沒有到條件斷點連接到行工作?它必須附加到每一行(正如你猜測你需要做的才能實現這種效果)。我沒有必要這樣做,但是我認爲這樣做會很不理想,因爲它會大大減慢程序的執行速度。一種更好的方法可能是使用IDE在所有貨幣實例中搜索代碼,以查看可能的設置位置,並在此處設置條件斷點。

+0

但是,這隻會爲特定行設置斷點*,我需要「所有行」的條件斷點。 我的原始陳述的第二次閱讀可能會澄清事情 – xtracto 2010-01-22 15:57:56

0

這是有可能在這兩個Intellj IDEA和Eclipse,與其他類型的condtional破發點的一起。此功能是您的IDE而不是JVM的功能。

0

在Eclipse也能夠設置條件斷點當變量被改變進行檢查。

這是不可能的一般條件,不過,被打破「那一刻這個複雜的條件爲真」

3

更改你寫軟件的方式。

不是:

public class BreakEncapsulation { 
    private float currency = 0.0; 

    public BreakEncapsluation() { 
    this.currency += 5; 
    } 

    public void updateCurrency() { 
    this.currency = 20.0; 
    } 

    public void increaseCurrencyByRate() { 
    this.currency += 2; 
    } 

    public void decreaseCurrencyByRate() { 
    this.currency -= 2; 
    } 
} 

這樣做:

public class HonourEncapsulation { 
    private float currency; 

    public HonourEncapsluation() { 
    setCurrency(getCurrency() + 5); 
    } 

    public void updateCurrency() { 
    setCurrency(20.0); 
    } 

    public void increaseCurrencyByRate() { 
    setCurrency(getCurrency() + getRate()); 
    } 

    public void decreaseCurrencyByRate() { 
    setCurrency(getCurrency() - getRate()); 
    } 

    public void setCurrency(float currency) { 
    System.out.println("Old currency = " + this.currency); 

    // Set the break point here. This is the only spot in the entire system 
    // where the value of currency changes. This idea follows the DRY 
    // principle: every piece of information should have exactly one 
    // occurrence. 
    // 
    this.currency = currency; 

    System.out.println("New currency = " + this.currency); 
    } 

    private float getCurrency() { return this.currency; } 

    private float getRate() { return 2.0; } 
} 

這不僅幫助,維護你的代碼(無代碼重複),它保持的可能性,開放的世界。它可能無助於解決當前的問題,但它可以幫助您避免將來出現一些問題。

這是一個名爲封裝技術,是密切相關的信息隱藏