2010-01-22 15 views
5

¿Es posible establecer un punto de interrupción para que el programa deje de ejecutarse después de que una instrucción haya realizado cierta condición true?Puntos de interrupción condicionales no dependientes de la línea

Una clase tiene una variable llamada currency y quiero hacer un punto de interrupción para que el programa se detenga en cualquier línea después de currency == 20. No sé el número de línea donde currency ha cambiado, por lo que sería como poner un punto de interrupción en en cada línea de mi clase [ed. donde currency se cambia].

¿Hay alguna manera de lograr eso (además de agregar un punto de interrupción en cada línea)?

Estoy usando NetBeans, pero una solución en cualquier otro IDE es bienvenida.

+0

Los depuradores antiguos que he usado llamaron a estos 'relojes'. Puede intentar buscar eso? –

Respuesta

3

Aquí hay un enlace en el establecimiento de puntos de interrupción condicionales en NetBeans: http://www.java-hair.com/?p=61

El texto pertinente:

En NetBeans, crear un punto de interrupción, el Haga clic derecho sobre el pequeño cuadrado de color rosa que significa la descanso. Haga clic en "Personalizar". Cuando aparezca el cuadro de diálogo personalizar , marque "Condición" y complete en la condición. Arriba está un ejemplo de este cuadro de diálogo en NetBeans.

También cubren Eclipse y JDeveloper.

Editar: en respuesta a su comentario, no, esto no se puede hacer de la manera que desee. La forma en que un depurador establece un punto de interrupción es cambiando un byte en la instrucción donde se establece el punto de interrupción. Cuando se evalúa la instrucción, la presencia de ese byte transfiere el control al depurador, que reemplaza el byte con lo que haya antes. Cuando se reanuda la ejecución, el depurador mueve el puntero de instrucción a la instrucción donde se estableció el punto de interrupción.

Un punto de interrupción condicional en una sola línea es fácil de implementar: cuando el control se transfiere al depurador, simplemente comprueba la condición y, si no es cierto, reanuda la ejecución automáticamente.

Entonces, ¿cómo funcionaría si no tuviera que adjuntar el punto de corte condicional a una línea? Tendría que adjuntarse a cada línea (tal como suponía que tendrías que hacer para lograr este efecto). No he tenido la necesidad de hacer esto, pero me imagino que sería indeseable, ya que retrasaría considerablemente la ejecución del programa. Un mejor enfoque podría ser usar su IDE para buscar en el código todas las instancias de moneda para ver dónde podría establecerse, y poner puntos de interrupción condicional allí.

+0

Pero eso establecería el punto de interrupción * solo * para la línea específica, necesito un punto de interrupción condicional para "todas las líneas". Una segunda lectura de mi declaración original puede aclarar las cosas – xtracto

0

Esto es posible tanto en Intellj IDEA como en Eclipse, junto con otros tipos de puntos de ruptura convencionales. Esta funcionalidad es una función de su IDE, no de la JVM.

0

En Eclipse es posible establecer un punto de interrupción condicional que se comprobará cuando se cambie una variable.

No es posible que las condiciones generales, sin embargo, para ser roto "el mismo momento en este complejo condicional se convierte en verdad"

3

cambiar la forma de escribir software.

En lugar de:

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

Haga lo siguiente:

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

Esto no sólo ayuda con el mantenimiento de su código (sin duplicación de código), mantiene un mundo de posibilidades abiertas. Puede que no te ayude con tu problema actual, pero te ayudará a evitar una serie de problemas en el futuro.

Esta es una técnica llamada encapsulación, y está estrechamente relacionado con la ocultación de información .

Cuestiones relacionadas