Quelle est la bonne façon de traiter une NumberFormatException lorsqu'il est prévu?
Je suis en cours d'exécution dans cette situation où j'ai besoin d'analyser un String
dans un int
et je ne sais pas quoi faire avec le NumberFormatException
. Le compilateur ne se plaint pas lorsque je n'ai pas l'attraper, mais je veux juste m'assurer que je suis de la manipulation de cette situation correctement.
private int getCurrentPieceAsInt() {
int i = 0;
try {
i = Integer.parseInt(this.getCurrentPiece());
} catch (NumberFormatException e) {
i = 0;
}
return i;
}
Je veux juste simplifier mon code comme ceci. Le compilateur n'a pas un problème avec elle, mais le thread meurt sur la NumberFormatException
.
private int getCurrentPieceAsInt() {
int i = 0;
i = Integer.parseInt(this.getCurrentPiece());
return i;
}
Google CodePro veut me connecter à l'exception d'une certaine façon, et je suis d'accord que c'est la meilleure pratique.
private int getCurrentPieceAsInt() {
int i = 0;
try {
i = Integer.parseInt(this.getCurrentPiece());
} catch (NumberFormatException e) {
i = 0;
e.printStackTrace();
}
return i;
}
Je veux cette méthode pour retourner 0
lorsque la pièce n'est pas un nombre ou ne peut pas être analysé. Quand je n'attrape pas la NumberFormatException
explicitement, n'est-il pas attribuer à la variable i
? Ou est-il une valeur par défaut qui Integer.parseInt()
retourne?
Style général dit que si j'attrape une exception, je devrais l'enregistrer quelque part. Je ne veux pas de journal. C'est un fonctionnement normal de cette exception, parfois, qui également ne pas s'asseoir bien avec moi. Je ne trouve pas une fonction, cependant, qui me dira si Integer.parseInt()
lèvera une exception. Donc, mon seul recours semble être juste de l'appeler et d'intercepter l'exception.
La javadoc pour parseInt
ne l'aide pas beaucoup.
Voici les questions que je voudrais savoir:
- Est-il une méthode que je peux appeler qui va me dire si
Integer.parseInt()
va jeter unNumberFormatException
avant de l'appeler? Ensuite, je n'aurais pas de problème de connexion, puisque cela ne devrait jamais se produire. - Si je n'ai tout simplement pas attraper l'exception, l'valiable pas assigné? Alors je vais simplement l'initialiser à la valeur que je veux quand ce n'est pas un nombre et ne pas intercepter l'exception.
- Est-il un moyen de marquer l'exception d'une certaine manière explicite que je ne m'inquiète pas à ce sujet? Je suis pensant que ce serait quelque chose de similaire
AWTEvent.consume()
. Si oui, alors je vais faire ce que Google CodePro ne voyons pas cela comme "anonymes".
Je ne suis pas un programmeur Java, mais en C#, Entier a une TryParse() méthode qui tente de l'analyser de l'int et renvoie un booléen si elle a réussi. Sûrement, c'est mieux que d'attendre une exception.
J'aimerais si il y avait un
tryParse()
méthode. Je crois que je comprends pourquoi il n'y a pas, puisqu'il s'agit essentiellement de faire le travail deux fois. Aussi, quand je l'ai essayer, la portion non utilisée du NumberFormatException
tue le fil sur le spot. J'ai mis à jour la question pour en tenir compte.OriginalL'auteur Erick Robertson | 2010-12-10
Vous devez vous connecter pour publier un commentaire.
Malheureusement, non. Au moins pas dans le noyau de l'API Java. Il est facile d'en écrire un, cependant - il suffit de modifier le code ci-dessous.
Si vous ne le faites pas l'exception, puis la pile détendre jusqu'à ce qu'il frappe un bloc catch qui va la traiter, ou il va se détendre complètement et arrêter le fil. La variable sera, en fait, ne pas être affecté, mais ce n'est pas exactement ce que vous voulez.
Il y a peut être un moyen de dire CodePro d'ignorer cet avertissement. Certainement avec des outils comme FindBugs et Checkstyle vous pouvez désactiver les avertissements dans des endroits spécifiques. (EDIT: @Andy a souligné comment le faire.)
Je soupçonne ce que vous voulez, c'est quelque chose comme l'Commons lang paquet mentionné par @daveb. Il est assez facile d'écrire une telle fonction:
OriginalL'auteur Cameron Skinner
Il est NumberUtils.toInt(String, int) dans commons lang qui va faire exactement ce que vous voulez.
Yep, mais le nombre de projets commons lang ne soyez donc pas besoin de rouler leur propre impl.
J'ai évité jusqu'à présent de faire, soit.
NumberUtils juste l'attrape. Ne pas obtenir autour de l'attraper. 🙂
OriginalL'auteur daveb
Oui, vous pouvez désactiver localement un CodePro règle d'audit pour une ligne de code:
http://code.google.com/javadevtools/codepro/doc/features/audit/locally_disabling_audit_rules.html
Cela dit, il n'est pas nécessaire d'inclure la journalisation des diagnostics dans chaque exception bloc catch. Parfois, le mieux est de prendre un défaut cours. Parfois, il est d'interagir avec l'utilisateur. Il dépend.
OriginalL'auteur Andy Thomas
Créer votre propre méthode de convenance pour maintenant et pour le futur:
Pas que je suis au courant. Gardez à l'esprit que si il y avait susceptible de mettre fin à l'analyse de la valeur deux fois (une fois pour valider et une fois pour l'analyser). Je comprends que vous voulez éviter d'exception, mais dans ce cas, c'est la capture de l'exception est le standard dans le langage Java, et il ne fournit pas un autre (au moins que je sache).
Vous devez attraper l'exception (même si elle ne fait rien), ou il va s'échapper de la bloquer et de les jeter à travers la pile.
Je ne sais pas du tout. Je voudrais utiliser au-dessus de la méthode de convenance (j'ai quelque chose de similaire dans une petite collection de services d'utilité générale que j'ai à disposition pour une utilisation sur tous mes projets).
Je ne voudrais pas vous connecter si ses vraiment une condition normale que vous manipulez. Je ne suis pas familiiar avec Google CodePro, mais j'espère que il ya un moyen de supprimer l'avertissement, par exemple, une sorte de @SuppressWarnings("xxx") annotation/mot-clé.
Edit: j'ai voulu montrer ces commentaires dans les commentaires ci-dessous
.
C'est pas mal si vous savez que vous ne voulez vraiment pas faire quelque chose avec elle. C'est seulement une mauvaise forme à ignorer les exceptions que vous devriez faire quelque chose d'utile avec.
Je suis d'accord avec @Cameron. L'exception (la situation) est gérée par le retour de la a indiqué
valueIfInvalid
. La notion générale de "exception non gérée" fait référence à la mauvaise pratique de l'aveugle et de unthinkly écriture vide blocs catch et de ne jamais retourner à véritablement d'examiner et de traiter le cas. Si la situation d'exception est considéré et fait la bonne chose pour la situation (même si la chose est de ne rien faire), vous avez "manipulé" l'exception à la règle.Le "final" est juste le désordre.
Steve Kuo - finale peut jamais être le désordre
OriginalL'auteur Bert F
Vous devez attraper l'Exception que vous êtes en train de faire. C'est ennuyeux, mais la meilleure approche.
Il n'y a pas de Java API méthode qui retourne 0 lorsque la chaîne n'est pas valide int.
Lorsque la chaîne n'est pas un int, une exception sera levée si votre int variable ne seront pas fixés, sauf si vous intercepter l'exception que vous êtes en train de faire.
OriginalL'auteur Marcus Leon
Si il n'est pas clair comment vous devez gérer à partir de la lecture, vous ne devriez pas l'attraper et l'appelant de traiter avec elle à la place. Si vous savez comment elle doit être traitée vous devriez faire cela. La journalisation, il peut ne pas être nécessaire ou très utile dans ce cas.
L'enregistrement d'une exception est plus utile si vous ne savez pas comment gérer l'exception et de vous laisser à la personne la lecture des journaux.
OriginalL'auteur Peter Lawrey
Votre premier bloc de code est correct.
i
de ne pas être implicitement converti à 0 lorsqu'une exception se produit et que vous avez à les attraper cette exception. Réglagei
à 0 à l'intérieur decatch
est correct, bien que vous pouvez simplement remplaceri = 0;
avecreturn 0;
. Vous ne pouvez pas éviter la manipulation d'exception dans ce cas.Pour clarifier, vous pouvez utiliser ceci:
non, il n'est pas mauvais pour intercepter une exception et ne rien faire avec elle. Le point de checked exceptions est de sorte que vous pouvez les attraper et à les gérer de la façon dont votre application a besoin d' - parfois, qui implique l'enregistrement ou de la récupération, mais parfois, vous savez qu'il n'a pas d'importance.
OriginalL'auteur darioo
Comme d'autres l'ont mentionné, il n'est pas intégré de base de l'API Java de la méthode que vous pouvez appeler pour valider un entier, mais vous pouvez utiliser le
Character
classe pour valider votre entrée sans à l'aide de la gestion des exceptions. Par exemple:En fait,
parseInt
lui-même utiliseCharacter.isDigit
en interne, ce que vous pouvez vérifier dans la JRE de code source. (Désolé, j'aurais inclus leparseInt
méthode ici, mais je ne sais pas si je suis autorisé sous les termes de la licence.) Si vous êtes en utilisant Eclipse et vous avez le JRE code source connectée à votre projet, vous pouvez droit-cliquez sur la méthodeInteger.parseInt
dans votre code et cliquez sur Ouvrir Déclaration.OriginalL'auteur rob