8
votes

Façon plus courte de vérifier pour NULL avec parsedouble?

montanttr code> est une valeur qui contient occasionnellement une double valeur représentée sous forme de chaîne.

Je veux utiliser double.parsedouble code> pour le lire dans un Double Code> Variable: Montantdbl CODE>. P>

if(amountStr!=null)
    this.amountDbl = Double.parseDouble(amountStr);


2 commentaires

Si une opération sur un objet jette un nullpointerexception , à quoi pensez-vous de faire de plus que de vérifier l'objet pour NULL?


Le temps de calcul de la vérification de null doit être des milliers de personnes plus courtes que la partie analysante.


8 Réponses :


12
votes

Vous obtenez une expression de conciseur si vous utilisez le opérateur ternaire :

import static pkg.UtilClass.parseDoubleSafely;


5 commentaires

Vous pouvez également marquer la fonction utilitaire comme finale . Cela permettrait d'inliquer.


Si c'est statique, cela ne peut pas être remplacé de toute façon.


J'aime la suggestion d'une fonction d'utilité afin que les fichiers de l'OP ne soient pas jachées de tests pour NULL.


@Alexey - Selon ce fil: Stackoverflow.com/questions/1159087/inlining-in-java étant La finale ne fait aucune différence pour l'inlinage, du moins dans Hotspot.


@Cperkins Oui, je dois être d'accord. De plus, statique ne peut pas être remplacé.



0
votes

Pourquoi ne pas l'initialiser à l'avance à une valeur "par défaut"?

if (amountDbl != /* some default value */)
    //parse it


1 commentaires

Je me demande quoi utiliser à la place de par défaut pour saisir quantitétr! = Par défaut apparaissent plus élégant que montanttr! = Null . Cela ne change certainement pas du tout la structure du code.



0
votes

Vous pouvez toujours l'entourer d'essayer d'essayer ou d'utiliser un opérateur ternaire (comme Aioobe le faisait) xxx


3 commentaires

Ah, accrocher des exceptions d'exécution en particulier NPE ne sonne pas vraiment bien, n'est-ce pas?


Si le bloc d'essai contient un seul appel à une méthode statique, je pense que c'est bien d'attraper des NPES.


Eh bien, vous pouvez toujours le réduire pour attraper simplement (NullpointerException NPE) {...} Catch (NumberFormatException NFE) {...}



0
votes

Ce n'est pas beaucoup mieux mais que vous pourriez faire:

this.amountDbl = Double.parseDouble(amountStr==null ? "" : amountString);


4 commentaires

Mauvaise idée depuis double.parsedouble ("") jette une exception numérique.


Eh bien, j'ai supposé que ce code serait déjà enveloppé dans un essai..Catch de toute façon. Vous devez gérer NumberFormatxception au castro n'ayant pas de numéro valide.


Double.Parsedouble (Montanttr == null? "0.0": montantstring); pourrait être une meilleure idée.


Je suppose que cela dépend de la façon dont vous voulez gérer des doubles invalides. Voulez-vous faire défaut à un numéro ou souhaitez-vous sauter ou peut-être journaliser, sauter et continuer? Il y a beaucoup de possibilités.



1
votes
  • Créez une classe d'emballage pour la quantité qui gère ce test dans le constructeur / usine ou gère une quantité nulle en tant que cas spécial, par exemple le modèle d'option null
  • Utilisez une bibliothèque d'utilitaires Java comme Guava qui implémente un facultatif (attendu à GUAVA R10)
  • Google GUAVA a un T firstNonnull (T First, T seconde) qui peut être utilisé comme double.Parsedouble (objets.firstnonnull (Montanttr, "0")) < / code>

  • (Passez à Scala et utilisez le Modèle d'option )


0 commentaires

-1
votes

J'utilise ceci:

double.Parsedouble (str.isempty ()? "0": STR);

ou

double.Parsedouble ((str == null || str.isempty ())? "0": STR);


1 commentaires

Vous ne devriez vraiment pas recommander cela, ce n'est pas lisible et il fait un appel inutile dans le cas de 0. De cette façon, ce n'est pas un bon morceau de code



0
votes

Pourrait être quelques années de retard pour répondre à cette question. La classe Numberutils dans org.apache.commons.lang3.Maath est une méthode créée à ce que vous demandez ( https://commons.apache.org/proper/commons-lang/apidocs/org/apache /Commons/lang3/math/numrutils.html#Createdouble-java.lang.string- )


0 commentaires

0
votes

J'imitié d'initialiser un objet et j'avais besoin de convertir de la chaîne en double et courut dans des valeurs null de la chaîne.

a a = nouveau A (valeur1, valeur2 == null? NULL: double.Parsedouble (valeur2), valeur3 ....);


0 commentaires