2010-01-22 5 views
5

Ist es möglich, einen Haltepunkt zu setzen, so dass das Programm nach einer bestimmten Bedingung true anhält?Nicht-zeilenabhängige bedingte Haltepunkte

Eine Klasse hat eine Variable mit dem Namen currency und ich möchte einen Haltepunkt machen, um das Programm bei jeder Zeile nach currency == 20 stoppen zu lassen. Ich weiß nicht die Zeilennummer, wo currency geändert wird, so wäre dies wie ein Haltepunkt in jede Zeile meiner Klasse [ED. wo currency geändert wird].

Gibt es eine Möglichkeit, dies zu erreichen (neben dem Hinzufügen eines Haltepunkts in jeder Zeile)?

Ich benutze NetBeans, aber eine Lösung in jeder anderen IDE ist willkommen.

+0

Ältere Debugger, die ich benutzt habe, nannten diese "Uhren". Sie könnten versuchen, danach zu suchen? –

Antwort

3

Hier ist ein Link auf bedingte Haltepunkte in NetBeans Einstellung: http://www.java-hair.com/?p=61

Der entsprechende Text:

In NetBeans, einen Haltepunkt erstellen, die rechts auf das kleine rosa Quadrat klicken das bedeutet die Unterbrechung. Klicken Sie auf "Anpassen". Wenn der Anpassungsdialog erscheint, überprüfen Sie "Condition" und füllen Sie in den Zustand. Oben ist ein Beispiel dieses Dialogs in NetBeans.

Sie decken auch Eclipse und JDeveloper.

Bearbeiten: als Reaktion auf Ihren Kommentar - nein, das kann nicht so gemacht werden, wie Sie es wollen. Die Art und Weise, wie ein Debugger einen Haltepunkt setzt, besteht darin, ein Byte in der Anweisung zu ändern, in der der Haltepunkt gesetzt ist. Wenn der Befehl ausgewertet wird, übergibt das Vorhandensein dieses Bytes die Kontrolle an den Debugger, der das Byte durch das ersetzt, was vorher vorhanden war. Wenn die Ausführung fortgesetzt wird, verschiebt der Debugger den Befehlszeiger zu der Anweisung, in der der Unterbrechungspunkt gesetzt wurde.

Ein bedingter Haltepunkt in einer einzelnen Zeile ist dann einfach zu implementieren - wenn die Steuerung zum Debugger übergeht, prüft er einfach die Bedingung, und wenn dies nicht der Fall ist, nimmt er die Ausführung automatisch wieder auf.

Also, wie würde es funktionieren, wenn Sie den bedingten Haltepunkt nicht an eine Linie anhängen müssen? Es müsste an jede einzelne Zeile angehängt werden (genau wie du vermutet hast, dass du diesen Effekt sonst erzielen müsstest). Ich hatte das nicht nötig, aber ich stelle mir vor, dass dies unerwünscht wäre, da dies die Programmausführung erheblich verlangsamen würde. Ein besserer Ansatz könnte darin bestehen, Ihre IDE zu verwenden, um den Code für alle Instanzen der Währung zu durchsuchen, um zu sehen, wo sie gesetzt werden könnte, und bedingte Haltepunkte dort zu platzieren.

+0

Aber das würde den Haltepunkt * nur * für die spezifische Zeile setzen, ich brauche einen bedingten Haltepunkt für "alle Zeilen". Eine zweite Lektüre meiner ursprünglichen Aussage kann die Dinge klären – xtracto

0

Dies ist sowohl in Intellj IDEA als auch in Eclipse möglich, zusammen mit anderen Arten von Standard-Breakpoints. Diese Funktionalität ist eine Funktion Ihrer IDE, nicht der JVM.

0

In Eclipse ist es möglich, einen bedingten Haltepunkt festzulegen, der beim Ändern einer Variablen überprüft wird.

Es ist für den allgemeinen Bedingungen nicht möglich, obwohl, zu „in dem Moment dieser Komplex bedingte wahr wird“ gebrochen werden Sie Software schreiben

3

ändern die Art und Weise.

Statt:

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; 
    } 
} 

tun:

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; } 
} 

Nicht nur, dass diese Hilfe Ihren Code mit der Aufrechterhaltung (keine Code-Duplizierung), hält es eine Welt der Möglichkeiten offen. Es hilft Ihnen vielleicht nicht bei Ihrem aktuellen Problem, aber es wird Ihnen helfen, eine Reihe von Problemen in der Zukunft zu vermeiden.

Dies ist eine Technik Verkapselung und ist eng verwandt mit Information Hiding genannt.

Verwandte Themen