parseInt und parseDouble sehr unterschiedlich?

Wolfsbein

Erfahrenes Mitglied
Hallo
Code:
private void parseServer(String line) {
        
        StringTokenizer st = new StringTokenizer(line, TOKENIZER);
        
        deviation =  Double.parseDouble(st.nextToken());
              
        byte serverTmp = Byte.parseByte(st.nextToken());
        
        maxForwardAcc   = Double.parseDouble(st.nextToken());
        maxSidewaysAcc  = Double.parseDouble(st.nextToken());
        maxSimTime      = Long.parseLong(st.nextToken());
        g               = Double.parseDouble(st.nextToken());
    }
Code:
String line = "10; 0; 10; 10; 1000; 6.67259E-11";
Wenn ich das so aufrufe, dann bekomme ich bei byte serverTmp =... eine
java.lang.NumberFormatException: For input string: " 0"
Wenn ich die Zeile in
Code:
double serverTmp = Double.parseDouble(st.nextToken());
ändere, dann hauts hin, das gleiche tritt aber dann bei Long.parseLong(... auf. Wenn ich in line die Leerzeichen rauslassen würde, dann funktioniert auch die Konvertierung auf andere Typen als double. Woran liegt das? Und wie löse ich das ohne irgendwelche casts? Danke.
 
Zuletzt bearbeitet:
Woher hast Du die Methode Double.parseByte()? Die gibt das in der Klasse java.lang.Double zumindest nicht. Da müsstest Du doch schon beim Compilieren Fehler bekommen...
Und wenn Du einen StringTokenizer benutzt und da sind Leerzeichen im String, dann kracht das auch beim parseDouble.
 
du musst die Leerzeichen entfernen mit trim() dann sollte es ansich gehen
Code:
 deviation =  Double.parseDouble(st.nextToken().trim());
 oder
 private void parseServer(String line) {
 line = line.replaceAll("\\s", "");
 ....
 }
 
Warum was so ist? Meinst du das Leerzeichen?

Wie der Name schon sagt ist ein white-space auch ein Zeichen, und da dieses nun mal nicht einer Zahl entspricht kommt dieser Fehler zustande.
Es ist eben Aufgabe des Programmierers dieses auszuschließen, mittels trim() bspw.
 
Mit ist klar, dass ein Leerzeichen ein Zeichen ist. Die Frage ist aber warum das bei Double ignoriert wird (oder automatisch trim aufgerufen wird) und bei anderen primitiven Typen eine Exception auslöst.
 
Ist in der API-Spezifikation für java.lang.Byte.parseByte() ausdrücklich spezifiziert:

"The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign [...]"

Und in der API-Spezifikation für java.lang.Double.parseDouble() steht ausdrücklich, dass der String über die Methode valueOf() ausgelesen wird. Und dort wiederum steht ausdrücklich, dass führende und abschliessende Whitespaces ignoriert werden.

Gruss
hul
 
Zurück