2009-10-22 5 views
2

J'ai le code suivant.Pourquoi le catch block est-il exécuté deux fois pour une seule exception?

try{ 
    Twitter twitter = new Twitter(user,password); 
    twitter.setStatus(txtStatus.getText()); 

    JOptionPane.showMessageDialog(null, "Success"); 
    txtStatus.setText(""); 
    txtStatus.requestFocus(); 

}catch(Exception e){ 
    JOptionPane.showMessageDialog(null, "Some Error.\n" + 
        " If you see this after Success Message..Ignore"); 
} 

Ici même après avoir reçu la boîte de dialogue «Message de réussite», la boîte de dialogue «Some Error» apparaît également. quelle peut être la raison? Le contrôle de débit ne devrait-il pas s'échapper du bloc d'arrêt s'il n'y a pas eu d'erreurs de temps d'exécution?

Même si je reçois également une exception, la boîte de dialogue "Some Error" apparaît deux fois. Pourquoi cela se produit-il?

+1

Que diriez-vous de l'impression actuelle? – ukanth

+2

Astuce du pro: ** JAMAIS 'attraper Exception' comme ceci **. Si vous le faites, votre clause de capture sera comme une boîte de chocolats - vous ne savez jamais ce que vous obtiendrez. – gustafc

+4

* Ne jamais dire jamais * - il y a quelques endroits où vous pouvez faire une 'catch Exception' ou même un' catch Throwable'. Dans le code d'infrastructure, le code d'encapsulation qui appelle un composant avec une instruction catch large empêche l'échec de l'intégralité de l'infrastructure en raison d'un composant. En outre, il s'agit plus d'un «rapport d'erreurs» que d'une «gestion des erreurs» - bien que ce code spécifique soit un mauvais exemple, car il n'existe aucun moyen de savoir exactement ce qu'est l'erreur. Habituellement, le «rapport d'erreurs» est fait dans un endroit globalement dans l'application si possible, et parfois l'erreur est emballée/ré-insérée si nécessaire. – Nate

Répondre

1

Votre code peut effectivement être appelé deux fois. Essayez de placer une instruction System.out.println en haut du code ou en l'exécutant sous un débogueur et vérifiez qu'elle n'est appelée qu'une seule fois.

8

Vous avez laissé ouverte la possibilité évidente que l'une des lignes de code après la boîte de dialogue de réussite s'affiche lève une exception. Vous n'attrapez pas une exception spécifique et vous n'avez pas de backtrace, donc il n'y a aucun moyen de le dire. Commencez votre débogage en utilisant la méthode printStackTrace de l'exception interceptée pour savoir d'où elle vient.

1

Essayez d'imprimer la pile e.printStackTrace() - il pourrait y avoir une exception après le message de réussite

+1

Non, l'utilisation de 'txtStatus' ne peut pas lancer une exception' NullPointerException', elle est déjà utilisée avant la première boîte de dialogue. – Bombe

+0

droite, n'a pas réussi à repérer celui-là :-) – msparer

2

Regardez l'exception que vous attraper et sa trace de la pile, et vous pouvez être éclairés (par exemple un NullPointerException avec txtStatus?) .

Ma conjecture: txtStatus est null après votre première boîte de dialogue, ou c'est la méthode requestFocus() qui lève une exception.

0

Exception peut être jeté dans l'une de ces deux lignes:

txtStatus.setText(""); 
txtStatus.requestFocus(); 
+0

Si c'est showMessageDialog() qui lève l'exception que rien ne va être affiché à moins que ce soit et exception qui est spécifique au cas lorsque le second paramètre est "Succès". – quosoo

+0

Désolé, je ne comprends pas votre pensée ... Je crois que si lakshmanan voir le message de réussite, que le problème n'est pas dans cette ligne. Il ne reste que deux lignes de code pouvant lancer une exception. – user132371

0

Je suis d'accord avec atomice ici: votre code est appelé plusieurs fois. Ajouter le bloc finally + retour d'erreur plus sensible.

try{ 
    Twitter twitter = new Twitter(user,password); 
    twitter.setStatus(txtStatus.getText()); 

    JOptionPane.showMessageDialog(null, "Success"); 
    txtStatus.setText(""); 
    txtStatus.requestFocus(); 

} 
catch(Exception e){ 
    JOptionPane.showMessageDialog(null, "Some Error.\n" + e.getMessage()); 
} 
finally { 
    JOptionPane.showMessageDialog(null, "Finally"); 
} 
+0

J'ai vérifié votre solution, il montre "Enfin" le dialogue après le message de succès, puis de nouveau il montre "Some Error" et "Enfin" le dialogue. Tel est l'ordre que je reçois succès Dialog Enfin Dialog Une erreur de dialogue Enfin Dialog – Anand

+0

Voilà. Cela signifie que vous n'êtes pas (comme prévu et contrairement à ce que vous pensiez) obtenir à la fois un succès et un message d'erreur sur l'itération sur le bloc: Il est appelé plusieurs fois. – alphazero

0

Et je vais jeter mes deux cents aussi bien.

Collez un point d'arrêt sur la première ligne et observez-le avec un débogueur. Vous verrez rapidement s'il est exécuté deux fois, si quelque chose est nul, et où l'erreur est.

Le débogueur est votre ami :-)

+0

Je l'ai vérifié en mode débogueur, ce qui précède est en fait dans une méthode actionPerformed() (écouteur d'événement sur un événement de clic de bouton). la même méthode est exécutée deux fois .... – Anand

+0

J'ai une classe actionListener (répondant à un événement de clic de bouton) et il y a la méthode actionPerformed(). Le code ci-dessus est le seul code de cette méthode. Pourquoi cela est-il exécuté deux fois? – Anand

Questions connexes