Formatieren mit DecimalFormat wirft Ausnahme - "Cannot format given Object as a Number"
Blick mag dies wie ein wiederholter Frage, aber ich habe versucht, in alle die links unten an und kann nicht eine richtige Antwort.
Cannot format given Object as a Anzahl ComboBox
Aber ich bin nicht immer was falsch. Hier ist mein 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);
Den format
Methode nimmt Objekttyp argument ist also, warum ich an einem String-Objekt, das gibt Ausnahme
Exception in thread "main" java.lang.IllegalArgumentException: Cannot
format-Objekts als Zahl.
Aber wenn ich double-Wert als argument, das Programm funktioniert einwandfrei. Aber wenn die Methode definiert ist, mit Object
Typ-argument, warum ich bin immer eine Ausnahme, indem Sie eine String
und nicht immer Ausnahme, indem Sie double
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
format()
Methode derDecimalFormat
überlastet ist.In dem Fall arbeiten, werden Sie den Aufruf :
Und in dem fehlerhaften Fall ist, werden Sie den Aufruf :
Die erste Methode hat eine sehr spezifische argument. Es erwartet Sie eine
double
.Ist dies nicht der Fall ist der zweite, der den Typ akzeptiert, ist sehr breit :
Object
und wo also die Prüfung auf den Typ übergeben wird zur Laufzeit erfolgen.Indem Sie ein argument, dass nicht ein
double
aber einString
die Methode aufgerufen wird, ist der zweite.Unter der Haube, ist diese Methode beruht auf der
format(Object number, StringBuffer toAppendTo, FieldPosition pos)
Methode, die erwartet, dass einnumber
argument, das eine Instanz derNumber
Klasse (Short
,Long
, ...Double
):Aber es ist nicht der Fall, wie Sie übergeben, um es ein
String
Instanz.Um das problem zu lösen, entweder geht ein
double
primitiv sind wie in dem Fall Erfolg oder konvertieren Sie IhreString
in eine Instanz vonNumber
wieDouble
mitDouble.valueOf(yourString)
.Empfehle ich den ersten Weg (vorbei an einem
double
) so ist es viel natürlicher in Ihren code bereits verwendetdouble
primitiven.Die zweite benötigt man eine zusätzliche Konvertierung Betrieb von
String
zuDouble
.Die Antwort ist in der javadoc. Es sagt klar, "Die Nummer kann von jeder Unterklasse von Number", und er sagt, dass es wirft
IllegalArgumentException
"wenn die Zahl ist null oder kein Instanz-Nummer."(Also, warum nicht Sie stellen Sie einfach die parameter ein
Number
geben? Denn die Klasse ist eine Unterklasse der abstraktenFormat
Klasse, dass ist nicht beschränkt auf numerische Formatierung. Die Erwartung, offenbar, ist, dass während der AllgemeinenFormat
- Klasse verfügt über eine Methode mit einerObject
Parameter, die Unterklassen vonFormat
erwartet, limit-der Parameter der Objekt-Typen, die Sie behandeln können, was Sie zu tun haben, nicht zur Laufzeit.)