2010-01-22 21 views
5

È possibile impostare un punto di interruzione in modo che il programma smetta di funzionare dopo che un'istruzione ha effettuato determinate condizioni true?Punti condizionali condizionali non dipendenti dalla linea

Una classe ha una variabile denominata currency e desidero creare un punto di interruzione per arrestare il programma su qualsiasi riga dopo currency == 20. Non conosco il numero di riga in cui è stato modificato currency, quindi sarebbe come inserire un punto di interruzione in ogni riga della mia classe [ed. dove viene modificato currency].

Esiste un modo per farlo (oltre all'aggiunta di un punto di interruzione su ciascuna riga)?

Sto usando NetBeans, ma una soluzione in qualsiasi altro IDE è la benvenuta.

+0

I debugger più vecchi che ho usato chiamavano questi "orologi". Potresti provare a cercarlo? –

risposta

3

Ecco un link su come impostare i punti di interruzione condizionali in NetBeans: http://www.java-hair.com/?p=61

Il testo in questione:

in NetBeans, creare un punto di interruzione, il fare clic destro sul piccolo quadrato rosa che indica il rompere. Fare clic su "Personalizza". Quando viene visualizzata la finestra di personalizzazione , selezionare "Condizione" e compilare nella condizione. Sopra è un esempio di questa finestra di dialogo in NetBeans.

Coprono anche Eclipse e JDeveloper.

Modifica: in risposta al tuo commento - no, questo non può essere fatto nel modo desiderato. Il modo in cui un debugger imposta un punto di interruzione è modificando un byte nell'istruzione in cui è impostato il punto di interruzione. Quando l'istruzione viene valutata, la presenza di quel byte trasferisce il controllo al debugger, che sostituisce il byte con qualsiasi cosa ci fosse prima. Quando viene ripristinata l'esecuzione, il debugger sposta il puntatore dell'istruzione sull'istruzione in cui è stato impostato il punto di interruzione.

Un breakpoint condizionale su una singola riga è quindi facile da implementare - quando il controllo viene trasferito al debugger, controlla semplicemente la condizione e, se non è vero, riprende automaticamente l'esecuzione.

Quindi, come funzionerebbe se non fosse necessario collegare il punto di interruzione condizionale a una linea? Dovrebbe essere collegato a ogni singola riga (proprio come hai ipotizzato che avresti dovuto fare per ottenere questo effetto in altro modo). Non ho avuto la necessità di farlo, ma immagino che sarebbe indesiderabile in quanto rallenterebbe notevolmente l'esecuzione del programma. Un approccio migliore potrebbe essere quello di usare il tuo IDE per cercare attraverso il codice per tutte le istanze di valuta per vedere dove potrebbe essere impostato, e mettere breakpoint condizionali lì intorno.

+0

Ma ciò imposterà il punto di interruzione * solo * per la linea specifica, ho bisogno di un punto di interruzione condizionale per "tutte le linee". Una seconda lettura della mia dichiarazione originale potrebbe chiarire le cose – xtracto

0

Ciò è possibile sia in Intellj IDEA che in Eclipse, insieme ad altri tipi di punti di interruzione condizionale. Questa funzionalità è una funzione del tuo IDE e non della JVM.

0

In Eclipse è possibile impostare un punto di interruzione condizionale da verificare quando si modifica una variabile.

non è possibile per le condizioni generali, però, di essere rotto "nel momento in cui diventa vero questo complesso con riserva"

3

Cambiare il modo di scrivere software.

Piuttosto che:

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

Fate questo:

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

Non solo questo aiuto con il mantenimento di codice (senza duplicazione del codice), si mantiene un mondo di possibilità aperte. Potrebbe non aiutarti con il tuo problema attuale, ma ti aiuterà a evitare una serie di problemi in futuro.

Si tratta di una tecnica chiamata incapsulamento, ed è strettamente correlata alle information hiding.