12
votes

Quand utiliser des exceptions à Java (exemple)

Je sais que ce serait une mauvaise pratique Bien que je sache que je ne pourrais pas expliquer pourquoi.

int [] intArr = ...
...
try{
   int i = 0;
   while(true){
      System.out.println(intArr[i++]);
   }
}catch(ArrayIndexOutOfBoundsException e){}


1 commentaires

Avez-vous lu efficacement Java de Joshua Bloch? Il a un échantillon de code très similaire comme le vôtre et une très bonne explication sur pourquoi ne pas le faire. Je recommande vivement de lire le chapitre d'exception sur ce livre.


10 Réponses :


20
votes

Vous avez raison: des exceptions sont destinées à, ehm, des cas exceptionnels . Les utiliser pour contrôler le flux de contrôle normal ne constituent pas seulement l'intention du code (qui suffirait à disqualifier déjà), mais aussi beaucoup plus lentement, car la lancée et la capture d'exceptions est coûteuse.

L'idiome standard (en Java5 et au-dessus) utilise une boucle pourchefer : xxx


2 commentaires

+1 C'est pourquoi vous ne devriez pas utiliser INTEGER.PARSE si vous savez que cela échouera régulièrement. Ex analyser les numéros xxxxxx dans lesquels plusieurs personnes ont pu échouer. Au lieu de cela, vous utiliseriez quelque chose comme Int.Tryparse dans C # (équivalent Java). Des exceptions sont rapides quand elles ne sont pas jetées. Mais quand ils sont lancés, ils sont plutôt lents (créez un nouvel objet avec le message, passez à travers beaucoup de captures imbriquées, etc.).


@LASSee pendant que je suis d'accord avec votre logique, je ne crois pas qu'il y ait un équivalent Java de Tryparse



1
votes

Vous êtes correct. Les exceptions ne doivent pas être utilisées pour gérer le flux de processus.


0 commentaires

5
votes

C'est faux parce que vous savoir que finalement la boucle atteindra le dernier élément de intar , il n'y a donc rien exceptionnel dans ce, vous " réellement attendre ce comportement.


0 commentaires

1
votes

Manger des exceptions La façon dont vous faites est généralement considérée comme une mauvaise pratique: si vous n'avez pas à faire un traitement supplémentaire, vous pouvez le connecter.


0 commentaires

1
votes

Seulement dans des situations exceptionnelles telles que

  • Quand une méthode ne peut pas faire ce qu'il est censé faire
  • ne pas contrôler le flux d'exécution

0 commentaires

3
votes

Comme toujours "cela dépend" et vous trouverez de nombreuses opinions différentes. Voici le mien

  • Les exceptions tombent dans deux catégories générales.
    • choses que vous pouvez raisonnablement anticipez et manipulez (FilenotfoundException)
    • choses que vous n'avez généralement pas anticipibles en supposant que le code parfait (arrayindexoutofbounds)

      Vous vous attendez à gérer généralement la première catégorie et non celle-ci. Ce dernier est généralement des erreurs de programmation.

      Votre exemple tombe dans ce dernier cas, une erreur de programmation. L'exception est destinée à donner de bonnes informations sur l'échec au moment de l'exécution et non comme un flux de contrôle.

      Certaines personnes diront que les premières exceptions vérifies et la seconde est décochée. Je serais en désaccord avec ça. Je trouve presque toujours des exceptions vérifiées une douleur en réalité car vous finissez presque toujours à faire / envelopper / réthrow à un autre type d'exception. Lors de la lancée des exceptions et de définir mes propres classes d'exception, j'utilise presque toujours non cochée.


0 commentaires

1
votes

Les exceptions devraient attraper quelque chose d'exceptionnel, en se loger et récupérer si possible.

Si cela fait partie du flux de programme normal, vous devez le gérer normalement.


0 commentaires

1
votes

Les exceptions sont pour exceptions dans le code. Pas pour les cas standard.

Cependant, votre code est plus grave, il est plus lent que ce serait sans utiliser d'exception. Créer l'exception, jeter l'exception et attraper l'exception prend une CPU et une mémoire supplémentaires.

De plus, le code devient plus difficile à lire pour d'autres programmeurs qui n'attendent qu'attendre des exceptions sur des cas d'erreur.


0 commentaires

5
votes

attraper des exceptions n'est qu'une mauvaise pratique quand elle concerne un runtimédiexception . Le arrayindexoutofboundSException que vous essayez d'attraper y a un.

RunTimeExceptions Identifiez récupérables de manière programmatique de manière programmatique causée par des défauts dans le flux de code. Vous ne devriez pas les réparer en les attrapant, mais en écrivant du code approprié et en utilisant des instructions de contrôle de flux tels que si / else , pendant , pour , etc.

Voir aussi:


0 commentaires

1
votes

Atteindre la fin d'un tableau n'est pas un cas exceptionnel. Vous connaissez la longueur avant de commencer à boucler, alors utilisez simplement une idiome standard.

for(int i = 0; i < intArr.length; ++i) {
    System.out.println(intArr[i]);
} 


0 commentaires