# Problem mit Integer.parseInt



## Lorenz (11. Jul 2011)

Hallo Forum,

ich habe ein kleines Problem mit Integer.parseInt(String)

Kurz zu den Fakten.

Ich kommuniziere mit einem uC via USB.
Ich wandle den input vom Bus per String s = new String(BytesArray)
Dieser String soll jetzt noch weiter in Integer gewandelt werden.

Und hier entsteht dann das Problem:

Ich bekomme eine java.lang.NumberFormatException: For input string: "0"
Aber wieso?

Grüße und Danke


----------



## Ariol (11. Jul 2011)

Codeausschnitt?
Hast du mal "BytesArray" ausgegeben? Welcher Datentyp ist das?


Fragen über Fragen... :wink:


----------



## Marco13 (11. Jul 2011)

In dem String sind wohl Anführungzeichen enthalten. Versuch' mal

String s = getFromUSB();
*s = s.substring(1, s.length()-1);*
int i = Integer.parseInt(s);

Falls es klappt kann man sich ggf. eine besstere Lösung überlegen.


----------



## SlaterB (11. Jul 2011)

ne, die Anführungszeichen kommen von der Exception, grad geprüft 

schau dir die Länge des Strings und jedes Zeichen einzeln an, irgendein Mist ist da drin und so erstellt man ja auch keine Strings,
ich schaffe es die Exception mit dieser Fehlermeldung, die kein weiteres Zeichen vermuten lässt, zu erhalten per

```
public class Test {
    public static void main(String[] args) {
        String st = Character.MAX_VALUE + "0";
        Integer.parseInt(st);
    }
}
```


----------



## Ariol (11. Jul 2011)

Hmm, ich bekomme keine Ausgabe:


```
public static void main(String[] args) {
		String test = "For input string: \"0\"";
		
		for(char c = Character.MIN_VALUE; c < Character.MAX_VALUE; c++)
		{
			try {
				String st = "0" + c;
				Integer.parseInt(st);
			} catch (NumberFormatException e) {
				if(test.equals(e.getMessage()))
				{
					System.out.println((int)c);
					return;
				}
			}
			try {
				String st = c+"0";
				Integer.parseInt(st);
			} catch (NumberFormatException e) {
				if(test.equals(e.getMessage()))
				{
					System.out.println((int)c);
					return;
				}
			}
		}
	}
```


----------



## SlaterB (11. Jul 2011)

da du nur genau einen char hinzufügst, beziehst du dich auf mein Posting?
lustigerweise lässt du genau  Character.MAX_VALUE aus (wobei eine vermeintlich einfache Schleifenänderung zur Endlosschleife führt),

der Vergleich mit test ist dann komplett obsolet, ein String aus zwei chars kann nie zu "0" equal sein,
die Ausgabe auf der Konsole ist eben was anderes, wenn es nur danach ginge dann würde ja auch das Parsen funktionieren


----------



## Ariol (11. Jul 2011)

Schande über mich...


----------



## Marco13 (11. Jul 2011)

SlaterB hat gesagt.:


> ne, die Anführungszeichen kommen von der Exception, grad geprüft



Dann Schande auch über mich 




SlaterB hat gesagt.:


> schau dir die Länge des Strings und jedes Zeichen einzeln an, irgendein Mist ist da drin und so erstellt man ja auch keine Strings,



Wenn man "hardwarenahe" Sachen macht (z.B. schon alles in Richtung JNI) dann sind byte-Arrays, aus denen man String machen muss, nichts ungewöhnliches. Aber deswegen mein nächster Tipp: Ist das vielleicht ein "zero-terminated" String, also ein byte array mit
byteArray[0] == '0' und
byteArray[1] == 0; // (also wirklich 0, nicht '0' !?)


----------



## Lorenz (11. Jul 2011)

Erst mal danke für die ganzen Antworten!

Hier noch der Codeausschnitt:


```
public synchronized void serialEvent(SerialPortEvent oEvent) {
		
		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
			try {
				
				int available = input.available();
				byte chunk[] = new byte[available];
				input.read(chunk, 0, available);			
				SG.setPulse(new String(chunk)); 					
				
			} catch (Exception e) {
				System.err.println(e.toString());
			}
		}
	}
```

Wenn ich das Byte Array mal direk ausgebe, bekomme ich folgendes

chunk[B@19efb05
chunk[B@723d7c
chunk[B@22c95b
chunk[B@1d1acd3
chunk[B@a981ca
chunk[B@8814e9
chunk[B@1503a3
chunk[B@1a1c887
chunk[B@e7b241
chunk[B@167d940
chunk[B@e83912
chunk[B@1fae3c6
chunk[B@7ffe01
chunk[B@fd13b5
chunk[B@118f375

könnte das [B@ das Problem sein?

Grüße


----------



## Ariol (11. Jul 2011)

Poste mal die Ausgabe davon:

```
public synchronized void serialEvent(SerialPortEvent oEvent) {
		
		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
			try {
				
				int available = input.available();
				byte chunk[] = new byte[available];				
				input.read(chunk, 0, available);	

				System.out.printf("Output of chunk[%d]\n",chunk.length);
				System.out.println("-------------------------------------------------------------------------------");
				for(int i = 0; i < chunk.length; i++){
					System.out.printf("0x%02X%s",chunk[i],(i+1)%16==0?"\n":" ");				
				}
				System.out.println("-------------------------------------------------------------------------------");
				
				SG.setPulse(new String(chunk)); 					
				
			} catch (Exception e) {
				System.err.println(e.toString());
			}
		}
	}
```

P.S.: Schreib deinen Code lieber in Java-Tags


----------



## Ariol (11. Jul 2011)

Lorenz hat gesagt.:


> .......
> 
> Wenn ich das Byte Array mal direk ausgebe, bekomme ich folgendes
> 
> ...



So darfst du das Array nicht ausgeben. Das was du da siehst ist die Adresse des Arrays.


----------



## HoaX (11. Jul 2011)

java.util.Arrays#toString nehmen


----------



## Lorenz (11. Jul 2011)

Hier ein Ausschnitt der Ausgabe:

Output of chunk[6]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A 0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[4]
-------------------------------------------------------------------------------
0x53 0x74 0x61 0x72 -------------------------------------------------------------------------------
Output of chunk[12]
-------------------------------------------------------------------------------
0x74 0x20 0x41 0x72 0x64 0x75 0x69 0x6E 0x6F 0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[2]
-------------------------------------------------------------------------------
0x30 0x0D -------------------------------------------------------------------------------
Output of chunk[1]
-------------------------------------------------------------------------------
0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A -------------------------------------------------------------------------------
Output of chunk[3]
-------------------------------------------------------------------------------
0x30 0x0D 0x0A --------------------------------------


----------



## Ariol (11. Jul 2011)

```
public synchronized void serialEvent(SerialPortEvent oEvent) {
		
		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
			try {
				
				int available = input.available();
				byte chunk[] = new byte[available];				
				input.read(chunk, 0, available);	
				StringBuilder hexString = new StringBuilder();
				for(int i = 0; i < chunk.length; i++){
					hexString.append(String.format("%02X",chunk[i]));
				}
				SG.setPulse(hexString.toString()); 					
				
			} catch (Exception e) {
				System.err.println(e.toString());
			}
		}
	}
```

Umwandeln get dann mit:

```
Integer.parseInt(hexString.toString(),16)
```


Aber der mit Größe 6 und der mit Größe 12 werden dir da noch Probleme machen. Die sind zu groß...

EDIT: Den 6er könntest du noch nach long bekommen. Der 12er musst du evtl. teilen.
int = 4 byte
long = 8 byte


----------



## Marco13 (11. Jul 2011)

Hmmm... nee, 
0x30 0x0D 0x0A
ist '0', gefolgt von "Line Feed" und "Carriage Return" (unter Windows also '\n'). Man müßte jetzt wissen, ob das unter Linux anders ist, aber wenn man von dem String einfach alle Zeichen nimmt, die '0' bis '9' sind, müßte es gehen...


----------



## Lorenz (11. Jul 2011)

ich könnte also eine Abfrage machen und nur die "Zeichen" die eine Zahl zwischen 0 - 9 sind auswerten und in einen String wandeln?

grüße


----------



## Ariol (11. Jul 2011)

Heute ist wohl nicht so ganz mein Tag, was die Auffassungsgabe angeht.

Also nochmal was zum Testen:

Anstelle von

```
int available = input.available();
	byte chunk[] = new byte[available];				
	input.read(chunk, 0, available);	
	SG.setPulse(new String(chunk));
```
das hier:

```
int available = input.available();
	byte chunk[] = new byte[available];				
	input.read(chunk, 0, available);	
	String numbers = new String(chunk);
	SG.setPulse(numbers.replaceAll("[^\\d]*", ""));
```

EDIT: Je nachdem was du noch so an Daten in 
	
	
	
	





```
setPulse()
```
 brauchst, kannst du das 
	
	
	
	





```
replaceAll()
```
 auch direkt bei 
	
	
	
	





```
parseInt()
```
 verwenden.


----------



## Lorenz (12. Jul 2011)

Super so funktioniert es!

Danke an Alle

Grüße


----------

