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 un NumberFormatException 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".
"Si je n'ai tout simplement pas attraper l'exception, l'valiable pas assigné? Alors je vais tout simplement pas attraper l'exception." - si vous n'êtes pas sûr de savoir si c'est une option viable, je vous suggère de l'essayer (et de procédure pas à pas avec un débogueur) pour être 100% sûr que vous comprenez ce qui se passe dans ce cas. Je ne veux pas sonner comme je parle bas, mais j'ai l'impression que d'avoir une solide compréhension des exceptions est important.
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