Attraper NumberFormatException est-il une mauvaise pratique?

Je dois parsingr une chaîne pouvant accepter des valeurs hexadécimales ou d’autres valeurs non hexadécimales

0xff , 0x31 ou A , PC , label , etc.

J’utilise ce code pour diviser les deux cas:

 Ssortingng input = readInput(); try { int hex = Integer.decode(input); // use hex ... } catch (NumberFormatException e) { // input is not a hex, continue parsing } 

Ce code peut-il être considéré comme “laid” ou difficile à lire? Existe-t-il d’autres solutions (peut-être plus élégantes)?

EDIT: Je tiens à préciser que (dans mon cas) une entrée incorrecte n’existe pas : je dois juste savoir s’il s’agit d’un nombre hexadécimal ou non. Et juste pour être complet, je fais un aspirant simple pour DCPU-16 .

La gestion des exceptions fait partie intégrante (et constitue l’un des objectives de la conception) du langage de programmation Java … vous ne devriez pas les rejeter simplement parce que vous pensez qu’elles sont “laides”.

Cela dit, si vous voulez un moyen simple et lisible de gérer NumberFormatException , vous pouvez utiliser la classe NumberUtils la place.

La toInt(Ssortingng str, int defaultValue) convertit une Ssortingng en un int , renvoyant une valeur par défaut en cas d’échec de la conversion. Si la chaîne est null , la valeur par défaut est renvoyée.

  NumberUtils.toInt(null, 1) = 1 NumberUtils.toInt("", 1) = 1 NumberUtils.toInt("1", 0) = 1 

La méthode encapsule la capture et la gestion des exceptions, comme indiqué dans le code source ci-dessous. Par conséquent, le client n’a besoin que de faire un appel de méthode unique.

 public static int toInt(Ssortingng str, int defaultValue) { if(str == null) { return defaultValue; } try { return Integer.parseInt(str); } catch (NumberFormatException nfe) { return defaultValue; } } 

La vôtre est la deuxième question que j’ai vue aujourd’hui poser des questions à ce sujet.

Non, il est parfaitement approprié d’attraper cette exception.

Et il vaut certainement mieux attraper une exception plus explicite (comme “NumberFormatException”) qu’une “Exception” générique.

A MON HUMBLE AVIS…

PS: vous mettez l’exception: à ce niveau, ou plus haut, c’est une question différente.

La règle générale est “le niveau le plus bas où vous savez ce qui s’est passé et comment récupérer au mieux”.

Ou, pour le dire différemment (citant un lien ci-dessous):

“Une méthode ne devrait intercepter une exception que si elle peut la gérer de manière raisonnable.”

Voici quelques discussions:

  • A quel niveau et comment convient-il d’attraper des exceptions

  • Pourquoi ne devrais-je pas envelopper chaque bloc dans “try” – “catch”?

Non, ce n’est pas une “mauvaise pratique”. Cela dépend de la situation.

Par exemple, en tant qu’Android, si l’utilisateur entre une chaîne “123a” dans une zone de texte censée accepter uniquement des entiers et est ensuite analysé, une exception sera générée, ce qui provoquera le blocage de l’application. Dans ce cas, il serait parfaitement logique d’attraper l’exception et de demander à l’utilisateur de ressaisir le texte.

Dans votre cas, je préférerais utiliser quelque chose comme une méthode isHexDigit pour utiliser NumberFormatException , à moins que vous ne puissiez NumberFormatException hypothèse sur le format de vos données. D’après votre description, il ne semble pas que ce soit le cas lorsque vous rencontrerez un sortilège. nombres vs. nombres non hexadécimaux.

Cela est dû au fait que des exceptions doivent être utilisées pour gérer des conditions exceptionnelles. Si vos données sont attendues comme suit: chiffres hexadécimaux ou chiffres non hexadécimaux, séparés par des espaces , rien n’est exceptionnel lorsque vous rencontrez un jeton autre qu’un chiffre hexadécimal.

De plus, l’utilisation de l’exception rend le code moins lisible: sans commentaires sur les données, cela masque le fait que les chiffres non hexadécimaux intercalés sont acceptables et que l’entrée est attendue.

Ayant déclaré cette préférence, je pourrais utiliser la gestion des exceptions pour traiter ce cas, et je vois certainement beaucoup de code le faire. Beaucoup de bonnes fonctionnalités sont emballées pour vous dans cette combinaison de decode / parseInt / NumberFormatException. Je ne l’utiliserais pas sans un commentaire explicite expliquant clairement ce que je fais.

Cela dépend du contexte, dans de nombreux cas, c’est mauvais, mais si c’est un endroit où il est très probable que l’entrée soit mauvaise et que vous ayez un paramètre par défaut, vous voudrez le saisir.

Ce Not about how good you code looks , mais de how good your code works ………. Ya offcourse it should be readable, comme il est dit …

N’importe quel imbécile peut écrire un code que l’ordinateur peut comprendre, mais seuls les grands programmeurs écrivent des codes que les humains peuvent comprendre.

Son parfaitement bien dans certains cas, vous devez avoir ce genre d’exceptions en place.

When you want to catch multiple exceptions which belong to the same inheritance tree, then create a try block, and multiple catch blocks from more specific to more abstract.

par exemple:

 `Animal <--- Carnivores <--- Dog` 

Supposons maintenant qu'il existe une exception DogException, CarnivoresException, AnimalException .

Alors ça doit être comme ça,

 try{ // your code } catch(DogException d){} catch(CarnivoresException c){} catch( AnimalException a){} 

Les captures ci-dessus ont été cascadées de plus spécifiques à plus abstraites, de sorte que l'exception est interceptée.

S'il n'y a pas d'inheritance, la capture peut être dans n'importe quel ordre ...

C’est le mieux que tu puisses faire. Une méthode va soit renvoyer une sorte d’indicateur de succès / d’erreur, soit renvoyer une exception, c’est juste une question qui convient le mieux. Ici, Sun a pris la décision pour nous, donc pas besoin de débat.

Ce qui me dérange plutôt, c’est que l’exception inclura une trace complète de la stack! Dans votre cas particulier, si vous lisez des millions de ces chaînes, vous remarquerez une performance médiocre (totalement inutile). Si cela vous importe, vous pouvez envisager de rédiger votre propre méthode (vous pouvez utiliser le code Sun comme guide). Vous pouvez ensuite décider vous-même si vous souhaitez utiliser une exception ou non. Si vous le faites, conservez une copie statique de l’exception et jetez-la toujours pour gagner du temps d’allocation. Et substituez fillInStackTrace pour qu’il ne fasse rien et que vous ne fillInStackTrace pas d’une trace de stack dénuée de sens dans votre exception.