8
votes

Quel est le meilleur - integer.parseint () et attraper une exception ou vérifiez la chaîne avec motif avant la conversion?

J'ai vu deux styles pour vérifier si une variable est un entier valide en Java. Un en faisant un integer.parseint code> et attrape une exception résultante. Un autre est en utilisant le motif. Laquelle des suivantes est une meilleure approche?

String integerRegex = "([0-9]{0,9})";
if (countStr.isEmpty() || !Pattern.matches(integerRegex, countStr)) {
    //return as the variable is not a proper integer.
    return;
}


4 commentaires

Votre expression régulière ne validait pas les nombres négatifs.


Dépend de la situation.


Que se passe-t-il si vous vérifiez "2147483647", "2147483650" ou "" avec votre regex?


BTW, je pense que vous devriez plutôt attraper numéroformatexception et pas seulement exception


4 Réponses :


8
votes

L'utilisation de l'approche ci-dessus est meilleure car elle considère tous les types d'erreurs éventuelles et gère tous les cas. Par exemple, ce que vous avez écrit ne paiera pas correctement les nombres négatifs.

Il est logique que de rédiger votre propre vérificateur si vous souhaitez valider un sous-ensemble donné de tous les entiers.

Un avis général: Ne réinventez pas la roue à moins que vous n'ayez de solides raisons de le faire.


3 commentaires

Oui. Mon expression régulière ne valide que des nombres positifs. Mais fait une integer.parseint () et attraper une exception à la validation d'une manière standard? Y a-t-il des méthodes intégrées disponibles pour la validation?


Oui c'est le moyen standard de valider un entier.


@FXGX compte tenu de savoir qu'il est presque impossible d'écrire une regex qui gérera tous les cas (2 ^ 31 est un entier parfaitement fin, mais jeterai une exception lorsque vous essayez de l'analyser car c'est trop gros), c'est une idée extrêmement mauvaise. Une regex qui gère tous les cas est évidemment possible, mais sera vraiment très longue ..



3
votes

Ces deux fonctions servent de différentes fins. Si vous voulez simplement vous assurer que la chaîne cotonne un modèle particulier, utilisez la deuxième approche. Si vous avez besoin de le convertir, vous devriez peut-être parseint () dans ce cas, il ne serait pas logique de le vérifier et de le convertir aussi.

Toutefois, si vous avez des exigences spécifiques pour le numéro, vous devrez peut-être le vérifier d'abord, car parseint () peut ne pas toujours jeter une exception si elle peut analyser quelque chose qui ne peut pas toujours analyser " t correspondre à votre exigence.


0 commentaires

-1
votes

Si vous venez de valider un entier, je pense que la deuxième façon est meilleure.

Ces deux méthodes vont bien fonctionner, mais évidemment une mise au point différente. Le premier se concentre sur la transformation elle-même, tandis que ce dernier est clairement contrôlé. Et vous voulez vérifier un numéro est, alors je pense que la deuxième méthode est meilleure. De plus, je pense que certaines des secondes méthodes sont plus lisibles, permettant la maintenance du code est clairement à voir, où la logique consiste à vérifier la validité d'un nombre au lieu d'une chaîne dans un nombre.


1 commentaires

Sauf que juste parce que la regex revient vrai ne signifie pas que vous pouvez réellement le représenter comme un entier 32 bits ..



4
votes

Il y a une très bonne raison de ne pas aller avec la deuxième approche si vous souhaitez réellement vérifier si la chaîne donnée peut être représentée sous forme d'entier 32 bits et non seulement qu'elle représente un entier dans le sens mathématique.

Je suis sûr que nous sommes tous d'accord pour dire que 2147483648 (2 ** 31 pour que ceux qui prennent l'attention) est un entier parfait, mais ce n'est qu'un des nombres infiniment nombreux pour lesquels les deux options donneront des résultats différents. Donc, si vous souhaitez vérifier si vous pouvez représenter une chaîne en tant qu'entreger 32 bits utilisez la méthode parseint , si vous voulez juste voir si c'est un entier aller avec la regex.

PS: Cela dit ne pas attraper une exception, mais la bonne exception NumberFormat ..


3 commentaires

@Marco désolé mais je ne vois vraiment pas ton point?


Max valeur est 2 ^ 31-1 et pas 2 ^ 31


@MARCO J'espère que, après tout tout, il est de trouver une valeur que ne peut pas être représenté comme un int .