# parseInt und parseDouble sehr unterschiedlich?



## Wolfsbein (12. Juli 2005)

Hallo

```
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());
    }
```


```
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

```
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.


----------



## hul (12. Juli 2005)

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.


----------



## elmato (12. Juli 2005)

du musst die Leerzeichen entfernen mit trim() dann sollte es ansich gehen

```
deviation =  Double.parseDouble(st.nextToken().trim());
 oder
 private void parseServer(String line) {
 line = line.replaceAll("\\s", "");
 ....
 }
```


----------



## Wolfsbein (12. Juli 2005)

hul hat gesagt.:
			
		

> Woher hast Du die Methode Double.parseByte()?
> ,,.


Das war ein c&p Fehler. Tut mir leid. 
trim ist mir bekannt. Ich möchte aber wissen, warum das so ist?


----------



## Romsl (12. Juli 2005)

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.


----------



## Wolfsbein (13. Juli 2005)

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.


----------



## hul (13. Juli 2005)

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


----------

