2010-01-22 1 views
5

Est-il possible de définir un point d'arrêt de manière à ce que le programme cesse d'être exécuté après qu'une condition ait rempli certaines conditions true?Points d'arrêt conditionnels non dépendants de la ligne

Une classe a une variable nommée currency et je souhaite créer un point d'arrêt pour que le programme s'arrête sur toute ligne après currency == 20. Je ne connais pas le numéro de ligne où currency est changé, donc ce serait comme mettre un point d'arrêt dans chaque ligne de ma classe [éd. où currency est modifié].

Existe-t-il un moyen d'accomplir cela (en plus d'ajouter un point d'arrêt à chaque ligne)? J'utilise NetBeans, mais une solution dans n'importe quel autre IDE est la bienvenue.

+0

Les débogueurs plus anciens que j'ai utilisés appelaient ces 'montres'. Vous pourriez essayer de chercher cela? –

Répondre

3

Voici un lien sur la configuration des points d'arrêt conditionnels dans NetBeans: http://www.java-hair.com/?p=61

Le texte pertinent:

En NetBeans, créer un point d'arrêt, le clic droit sur le petit carré rose qui signifie la Pause. Cliquez sur "Personnaliser". Lorsque la boîte de dialogue de personnalisation apparaît, cochez "Condition" et remplissez dans la condition. Ci-dessus est un exemple de cette boîte de dialogue dans NetBeans.

Ils couvrent également Eclipse et JDeveloper.

Modifier: en réponse à votre commentaire - non, cela ne peut pas être fait comme vous le souhaitez. La façon dont un débogueur définit un point d'arrêt consiste à modifier un octet dans l'instruction où le point d'arrêt est défini. Lorsque l'instruction est évaluée, la présence de cet octet transfère le contrôle au débogueur, qui remplace l'octet par ce qui existait auparavant. Lorsque l'exécution est reprise, le débogueur déplace le pointeur d'instruction vers l'instruction où le point d'arrêt a été défini. Un point d'arrêt conditionnel sur une seule ligne est alors facile à mettre en œuvre - lorsque le contrôle est transféré au débogueur, il vérifie simplement la condition, et s'il n'est pas vrai, il reprend automatiquement l'exécution. Alors, comment cela fonctionnerait-il si vous n'aviez pas à attacher le point d'arrêt conditionnel à une ligne? Il devrait être attaché à chaque ligne (comme vous l'avez supposé vous auriez besoin de faire pour obtenir cet effet autrement). Je n'ai pas eu besoin de le faire, mais j'imagine que ce serait indésirable car cela ralentirait considérablement l'exécution du programme. Une meilleure approche pourrait consister à utiliser votre EDI pour rechercher dans le code toutes les instances de devise pour voir où il pourrait être défini, et y placer des points d'arrêt conditionnels.

+0

Mais cela définirait le point d'arrêt * seulement * pour la ligne spécifique, j'ai besoin d'un point d'arrêt conditionnel pour "toutes les lignes". Une deuxième lecture de ma déclaration d'origine peut clarifier les choses – xtracto

0

Ceci est possible à la fois dans Intellj IDEA et Eclipse, avec d'autres types de points de rupture conditionnels. Cette fonctionnalité est une fonction de votre IDE et non de la JVM.

0

Dans Eclipse, il est possible de définir un point d'arrêt conditionnel à vérifier lorsqu'une variable est modifiée.

Il est impossible pour les conditions générales, cependant, être brisé « moment ce complexe conditionnel devient vrai »

3

Modifier la façon dont vous écrivez un logiciel.

Plutôt que:

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

Pour ce faire:

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 seulement cette aide avec l'entretien de votre code (pas de duplication de code), il garde un monde de possibilités ouvertes. Il pourrait ne pas vous aider avec votre problème actuel, mais il vous aidera à éviter un certain nombre de problèmes à l'avenir.

C'est une technique appelée encapsulation, et est étroitement lié à la dissimulation d'information .

Questions connexes