Mise en forme à l'aide de DecimalFormat throws exception - “Impossible de formater Objet donné qu'un certain Nombre”
Cela pourrait ressembler à une répétition de la question mais j'ai essayé dans tous les liens ci-dessous et ne peut pas obtenir une réponse adéquate.
Impossible de formater Objet donné comme un Numéro de zone de liste déroulante
Mais je ne reçois pas ce qui est erroné. Voici mon code
DecimalFormat twoDForm = new DecimalFormat("#.##");
double externalmark = 1.86;
double internalmark = 4.0;
System.out.println(String.valueOf((externalmark*3+internalmark*1)/4));
String val = String.valueOf((externalmark*3+internalmark*1)/4);
String wgpa1=twoDForm.format(val); //gives exception
String wgpa2=twoDForm.format((externalmark*3+internalmark*1)/4)); //works fine
System.out.println(wgpa1);
La format
méthode prend en argument type Objet, c'est pourquoi je suis passé d'un objet de type String qui donne exception
Exception in thread "main" java.lang.IllegalArgumentException: Ne Peut Pas
format de l'Objet donné qu'un certain Nombre.
Mais quand je fais le double de la valeur comme argument le programme fonctionne très bien. Mais si la méthode est définie avec Object
argument de type pourquoi je me fais une exception tout en passant un String
et ne pas avoir d'exception en passant double
?
Vous devez vous connecter pour publier un commentaire.
La
format()
méthode deDecimalFormat
est surchargé.Dans le cas, vous êtes en invoquant :
Et dans le cas d'échec, vous êtes en invoquant :
La première méthode prend un très spécifique argument. Il s'attend à un
double
.Ce n'est pas le cas de la seconde, dont le type est accepté est très large :
Object
et où donc le contrôle sur le type passé est effectué au moment de l'exécution.En fournissant un argument qui n'est pas un
double
mais unString
, la méthode invoquée est la seconde.Sous le capot, cette méthode repose sur le
format(Object number, StringBuffer toAppendTo, FieldPosition pos)
méthode qui attend unnumber
argument qui est une instance de laNumber
classe (Short
,Long
, ...Double
):Mais il n'est pas le cas que vous avez passé un
String
exemple.Pour résoudre le problème, passez
double
primitive comme dans le cas de réussite ou de convertir votreString
dans une instance deNumber
commeDouble
avecDouble.valueOf(yourString)
.Je conseille la première méthode (passage d'un
double
), car il est plus naturel de votre code qui utilise déjàdouble
primitives.La seconde exige une conversion supplémentaire opération de
String
àDouble
.La réponse est dans la javadoc. Il le dit clairement, "Le nombre peut être de n'importe quelle sous-classe de Nombre", et il dit qu'il jette
IllegalArgumentException
"si le nombre est nul ou n'est pas une instance de Nombre."(Alors, pourquoi ne pas simplement faire le paramètre a
Number
type? Parce que la classe est une sous-classe de l'abstraitFormat
classe qui ne se limite pas à la mise en forme numérique. L'attente, apparemment, est que, bien que le généralFormat
classe a une méthode avec unObject
paramètres, les sous-classes deFormat
est censé limiter les paramètres pour les types d'objets qu'ils peuvent manipuler, qui ils ont à faire au moment de l'exécution.)