Question

Je suis en cours d'exécution dans cette situation où je dois analyser un String dans un int et je ne sais pas quoi faire avec le NumberFormatException. Le compilateur ne se plaint pas quand je ne pas l'attraper, mais je veux juste vous assurer que je suis bien gérer cette situation.

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
    }
    return i;
}

Je veux simplifier tout mon code comme celui-ci. Le compilateur n'a pas de problème avec elle, mais le fil meurt sur le NumberFormatException.

private int getCurrentPieceAsInt() {
    int i = 0;
    i = Integer.parseInt(this.getCurrentPiece());
    return i;
}

Google CodePro me veut connecter l'exception d'une certaine façon, et je suis d'accord que cela 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 revenir 0 lorsque la pièce en cours est pas un numéro ou ne peut pas être analysé. Quand je ne prends pas le NumberFormatException explicitement, il n'attribue pas la i variable? Ou est-il une valeur par défaut qui retourne Integer.parseInt()?

style général dit que si je prends une exception, je l'enregistrer quelque part. Je ne veux pas l'enregistrer. Il est le fonctionnement normal de cette exception à être jeté parfois, qui ne siège pas aussi bien avec moi. Je ne trouve pas une fonction, mais, ce qui me dira si Integer.parseInt() va lancer une exception. Donc, mon seul moyen d'action semble appeler juste et attraper l'exception.

Le javadoc pour parseInt ne nous aide pas beaucoup.

Voici les questions spécifiques que je voudrais savoir:

  • Y at-il une méthode que je peux appeler cela me dire si Integer.parseInt() va jeter un NumberFormatException avant de l'appeler? Ensuite, je n'aurais aucun problème connecter cela, car il ne devrait jamais arriver.
  • Si je simplement ne saisis pas l'exception, sera le valiable pas se voir attribuer différentes? Ensuite, je vais simplement l'initialiser à la valeur que je veux, quand ce n'est pas un numéro et pas attraper l'exception.
  • Est-il possible de marquer l'exception en quelque sorte explicitement que je ne me soucie pas à ce sujet? Je pense que ce serait quelque chose de similaire à AWTEvent.consume(). Si oui, alors je vais le faire pour que Google CodePro ne voit pas cela comme « unlogged ».
Était-ce utile?

La solution

  • Y at-il une méthode que je peux appeler cela me dira si Integer.parseInt () va lancer une NumberFormatException avant de l'appeler? Ensuite, je n'aurais aucun problème connecter cela, car il ne devrait jamais arriver.

Malheureusement, non. Du moins pas dans l'API Java de base. Il est facile d'écrire un, cependant -. Il suffit de modifier le code ci-dessous

  • Si je simplement ne saisis pas l'exception, sera le valiable pas se voir attribuer différentes? Ensuite, je vais simplement l'initialiser à la valeur que je veux, quand ce n'est pas un numéro et pas attraper l'exception.

Si vous ne surprenez pas l'exception puis la pile se détendre jusqu'à ce qu'il frappe un bloc catch qui traitera, ou il se détendre complètement et arrêter le fil. La variable, en fait, pas être affecté, mais ce n'est pas exactement ce que vous voulez.

  • Est-il possible de marquer l'exception en quelque sorte explicitement que je ne me soucie pas à ce sujet? Je pense que ce serait quelque chose de similaire à AWTEvent.consume (). Si oui, alors je vais le faire pour que Google CodePro ne voit pas cela comme « unlogged ».

Il peut y avoir un moyen de dire CodePro d'ignorer cet avertissement particulier. Certes, avec des outils comme FindBugs et Checkstyle vous pouvez désactiver les avertissements dans des emplacements spécifiques. (EDIT:. @Andy a souligné comment faire)

Je soupçonne ce que vous voulez est quelque chose comme le paquet lang Commons mentionné par @daveb. Il est assez facile d'écrire une telle fonction:

int parseWithDefault(String s, int def) {
    try {
        return Integer.parseInt(s);
    }
    catch (NumberFormatException e) {
        // It's OK to ignore "e" here because returning a default value is the documented behaviour on invalid input.
        return def;
    }
}

Autres conseils

Il y a NumberUtils.toInt (String, int) communes lang qui fera exactement ce que vous voulez.

NumberUtils.toInt("123", 42) ==> 123
NumberUtils.toInt("abc", 42) ==> 42
* Is there a way to mark the exception somehow explicitly that I don't care about it? I'm thinking this would be something similar to AWTEvent.consume(). If so, then I will do this so that Google CodePro doesn't see this as "unlogged".

Oui, vous pouvez désactiver localement une règle d'audit CodePro pour une ligne de code:

http://code.google.com/javadevtools/ CodePro / doc / caractéristiques / audit / locally_disabling_audit_rules.html

Cela dit, il est pas nécessairement tenu d'inclure l'enregistrement des diagnostics dans chaque bloc de capture d'exception. Parfois, la meilleure action est de prendre un cours par défaut. Parfois, il est d'interagir avec l'utilisateur. Cela dépend.

Créez votre propre méthode pratique pour le moment et l'utilisation future:

public static int parseInt(final /*@Nullable*/ String s, final int valueIfInvalid) {
    try {
        if (s == null) {
            return valueIfInvalid;
        } else {
            return Integer.parseInt(s);
        }
    } catch (final NumberFormatException ex) {
        return valueIfInvalid;
    }
}
  

Y at-il une méthode que je peux appeler cela me dira si Integer.parseInt () va lancer une NumberFormatException avant de l'appeler? Ensuite, je n'aurais aucun problème connecter cela, car il ne devrait jamais arriver.

Pas que je sache. Gardez à l'esprit que, si deux fois (une fois pour valider et une fois pour l'analyser) étaient, vous finissez probablement vers le haut l'analyse de la valeur. Je comprends que vous voulez éviter l'exception, mais dans ce cas, cela est l'exception est la capture l'idiome standard Java et il ne fournit pas une autre (au moins que je sache).

  

Si je simplement ne saisis pas l'exception, sera le valiable pas se voir attribuer différentes? Ensuite, je vais simplement l'initialiser à la valeur que je veux, quand ce n'est pas un numéro et pas attraper l'exception.

Vous devez attraper l'exception (même si elle ne fait rien) ou il échappera au bloc et jeter à travers la pile.

  

Y at-il un moyen de marquer l'exception en quelque sorte explicitement que je ne me soucie pas à ce sujet? Je pense que ce serait quelque chose de similaire à AWTEvent.consume (). Si oui, alors je vais le faire pour que Google CodePro ne voit pas cela comme « unlogged ».

Je ne sais pas de tout. J'utiliser la méthode ci-dessus pratique (j'ai quelque chose de similaire dans une petite collection d'utilitaires généraux dont je dispose pour mes tous les projets).

Je ne vous connecter si son vraiment une condition normale que vous gérez. Je ne suis pas familiiar avec Google CodePro, mais je l'espère, il est un moyen de supprimer l'avertissement, par exemple annotation / mot-clé une sorte de @SuppressWarnings ( "xxx").


Edit: Je voulais signaler ces commentaires dans les commentaires ci-dessous

  

Cette approche ne gère pas encore l'exception. Il est mal vu de prendre une exception et ne rien faire avec elle. Voilà pourquoi je suis à la recherche d'une meilleure solution

.

  

... L'exception (la situation) est en cours de traitement en retournant le valueIfInvalid indiqué. « mauvaise forme » vous faites référence à la une mauvaise pratique de l'écriture aveugle et irréfléchie blocs catch vide et ne jamais revenir à vraiment considérer et adresse l'affaire. Si le situation d'exception est considérée et fait la bonne chose pour la situation ( même si la bonne chose est de ne rien faire ), puis vous avez « manipulé » l'exception .

Vous devriez intercepter l'exception que vous faites. Il est ennuyeux, mais la meilleure approche.

Il n'y a pas de méthode API Java qui retourne 0 quand la chaîne est pas un int valide.

Lorsque la chaîne n'est pas un entier, une exception sera levée si votre variable int ne sera pas réglée à moins que vous attrapez l'exception que vous faites.

Si ce ne est pas clairement comment vous devez le gérer à partir du getter, vous ne devriez pas l'attraper et de laisser l'affaire de l'appelant avec elle à la place. Si vous savez comment il devrait être vous manipulé devriez juste le faire. L'exploitation du bois ne peut pas être nécessaire ou très utile dans ce cas.

Connexion une exception est plus utile si vous ne savez pas comment gérer l'exception et que vous quittez à la personne en lisant les journaux.

Votre premier bloc de code est correct. i ne sera pas converti implicitement à 0 lorsqu'une exception se produit et vous devez attraper cette exception. Réglage i à 0 à l'intérieur catch est correcte; bien que vous pouvez simplement remplacer i = 0; avec return 0;. Vous ne pouvez pas éviter la gestion des exceptions dans ce cas.

Pour clarifier, vous pouvez utiliser ceci:

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        // log that an exception occured if it's needed
        return 0;
    }
    return i;
}

Comme d'autres l'ont mentionné, il n'y a pas une méthode Java intégrée dans le noyau API, vous pouvez appeler pour valider un entier, mais vous pouvez utiliser la classe Character pour valider votre entrée sans utiliser la gestion des exceptions . Par exemple:

package com.example.parseint;

public class ValidateIntExample {
    public static boolean isInteger(String s) {
        if (s == null) {
            return false;
        }

        s = s.trim();

        if (s.length() == 0) {
            return false;
        }

        int start = 0;
        if (s.charAt(0) == '-') { // handle negative numbers
            if (s.length() == 1) {
                return false;
            }
            else {
                start = 1;
            }
        }

        for (int i = start; i < s.length(); i++) {
            if (! Character.isDigit(s.charAt(i))) {
                return false;
            }
        }

        return true;
    }
}

En fait, parseInt lui-même utilise Character.isDigit en interne, que vous pouvez vérifier dans le code source de JRE. (Désolé, j'ai inclus la méthode parseInt ici, mais je ne sais pas si je suis autorisé sous les termes de la licence.) Si vous utilisez Eclipse et vous avez le code source de JRE jointe à votre projet, vous pouvez droit -cliquez sur la méthode Integer.parseInt dans votre code et cliquez sur Ouvrir Déclaration.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top