# StringTokenizer



## kimi (8. Dezember 2009)

Hi. ich muss die Datei aus Editor einlesen, in der Tabelle Speichern und  ausgeben. 
das hab ich bis jetzt  geschrieben,jedoch bekomme ich bei der Ausführung die Fehlermeldung: at java.util.StringTokenizer.nextToken(Unknown Source)
	at java.util.StringTokenizer.nextElement(Unknown Source)
kann mir jemand bitte dabei helfen. danke im vorraus



```
public class CSVDatei {
	
	private java.util.ArrayList<MeineMannschaft> importListe = new java.util.ArrayList<MeineMannschaft>();
	
	private Tabelle tabelle;
	
	
	//Konstruktor
	public CSVDatei()
	{
		this.tabelle = new Tabelle();
	}
	
	public void liesMannschaftenEin(){
		
		String datei = liesDateiEin("C:\\Mannschaften.csv");
				//System.getProperty("user.dir") + "/Mannschaften.csv");
		java.util.StringTokenizer tokens = new java.util.StringTokenizer(datei, ",", false);
	
		while (tokens.hasMoreElements())	// durchläuft die Elemente innerhalb der Zeile
		{
			while (tokens.hasMoreTokens())	// durchläuft die Zeilen innerhalb der Datei
			{
				
				//importiert die Elemente in die ArrayList
				importListe.add(new MeineMannschaft(
						(new String((String)tokens.nextElement())),			//name 
						(new String((String)tokens.nextElement())),			//ort
						(new Integer((String) tokens.nextElement())),		//anz. spiele
						(new Integer((String) tokens.nextElement())),		//siege
						(new Integer((String) tokens.nextElement())),		//niederlagen
						(new Integer((String) tokens.nextElement())),		//remis
						(new Integer((String) tokens.nextElement())),		//koerbe
						(new Integer((String) tokens.nextElement())),		//gegenkoerbe
						(new Integer((String) tokens.nextElement()))));		//tabellenpunkte
			
			
						
			}
	
		}
		tabelle.setListeVonMeineMannschaften(importListe);

	}

	
	public void gibMannschaftenAufKonsoleAus(){
		
		for(MeineMannschaft element: importListe){
			java.lang.System.out.println("drucke...");
			java.lang.System.out.println(element);
		}
	}
	

	

	public String liesDateiEin(String datei)
	{
		java.io.File f = new java.io.File(datei);

		int val = 0;
		StringBuffer sb = new StringBuffer();
		java.io.FileReader input;
		try
		{
			input = new java.io.FileReader(f);
			while ((val = input.read()) != -1)
			{
				sb.append((char) val);
			}
			input.close();
		}
		catch (Exception e)
		{

		}

		return sb.toString();
	}
	
	public void einlesenDatei() throws java.io.IOException {
		java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream("C:\\Mannschaften.csv")));
		String line = "";
		while(true){
		line = reader.readLine();
		if(line == null){
		break;	
		}	


		java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(line, ",");

		while(tokenizer.hasMoreTokens()){
		String token = tokenizer.nextToken();
		
		}
		}
		
	}

	
}


// Main methode
public static void main(String[] args) {
		CSVDatei datei = new CSVDatei();
		datei.liesMannschaftenEin();
		datei.gibMannschaftenAufKonsoleAus();

}
```


----------



## zerix (8. Dezember 2009)

Hallo,

das ist nicht die komplette Fehlermeldung.

Ich würde mal behaupten, dass der Fehler hier liegt. Da du einfach annimmst, dass noch soviele Tokens in dem StringTokenizer vorhanden sind und in Wirklichkeit nicht mehr so viele Tokens vorhanden sind.

```
(new String((String)tokens.nextElement())), //name
(new String((String)tokens.nextElement())), //ort
(new Integer((String) tokens.nextElement())), //anz. spiele
(new Integer((String) tokens.nextElement())), //siege
(new Integer((String) tokens.nextElement())), //niederlagen
(new Integer((String) tokens.nextElement())), //remis
(new Integer((String) tokens.nextElement())), //koerbe
(new Integer((String) tokens.nextElement())), //gegenkoerbe
(new Integer((String) tokens.nextElement())))); //tabellenpunkte
```

Gruß

Sascha


----------



## kimi (8. Dezember 2009)

hi. danke für deine antwort aber ich weiß immernoch nicht was ich tun soll.
wenn ich das so schreibe kommt weiterhin diese fehlermeldung und ich weiß nicht ob der die einzelne Elemente in Arraylist importiert.
System.out.println( tokens.nextToken() );	
				String tmp = tokens.nextToken();     
				System.out.println((tmp == null || tmp.length() == 0) ? "LEER" : tmp);

fehlermeldung:Exception in thread "main" java.util.NoSuchElementException
	at java.util.StringTokenizer.nextToken(Unknown Source)
	at CSVDatei.liesMannschaftenEin(CSVDatei.java:42)
	at StartApp.main(StartApp.java:9)


----------



## Thomas Darimont (8. Dezember 2009)

Hallo,

bei der Verwendung von StringTokenizer sollte man vor einem Zugriff auf nextElement mit hasMoreElements() prüfen ob noch ein Element verfügbar ist.


```
StringTokenizer s  = new StringTokenizer("a b c");
        while(s.hasMoreElements()){
            System.out.println(s.nextElement());
        }
```

Viel besser als die alte Klasse StringTokenizer ist es die split(...) Methode der Klasse String zu verwenden:


```
for(String s : "a;b;c".split(";")){
            System.out.println(s);
        }
```

Gruß Tom


----------



## zerix (8. Dezember 2009)

Die Methoden 
	
	
	



```
hasMoreElements()
```
 und 
	
	
	



```
hasMoreTokens
```
 machen genau das gleiche. Genau wie die dazu gehörigen next-Methoden.

Wie gesagt, das Problem ist, dass du auf Elemente zugreifen möchtest, obwohl du schon am Ende des Tokenizers angekommen bist. 

Ich sehe, dass du die Daten aus einer CSV-Datei ausliest, dann schau dir mal das an
http://www.csvreader.com/java_csv_samples.php
http://sourceforge.net/projects/javacsv/

Das sind zwei Libraries zum auslesen von CSV-Dateien mit Java.

Gruß

Sascha


----------



## Vereth (9. Dezember 2009)

Kann es sein, dass du in deinen Datenzeilen Leerfelder hast? Wenn zwei Separatoren aufeinanderfolgen, hast du plötzlich ein Token weniger, das zurückgeliefert werden kann. Dies könntest du z.B. dadurch vermeiden, dass du im Konstruktur _true_ angibst, um überprüfen zu können, ob _nextElement()_ einen Feldtrenner zurückliefert (dann hast du ein leeres Datenfeld) oder nicht (dann hast du ein verwertbares Token).


----------



## kimi (9. Dezember 2009)

so sieht mein csv-datei im editor aus. 
er liest die ganze daten ein und zeigt sie auch an aber am ende zeigt er die NoSuchElementException.  aber wenn ich die    System.out.println  kommentiere kommt kein Exception mehr.

            //	System.out.println( tokens.nextToken() );	 
				String tmp = tokens.nextToken();   
				System.out.println((tmp == null || tmp.length() == 0) ? "LEER" : tmp);	
			}

 danke für deine hilfe

```
SV Halle,Halle,0,0,0,0,0,0,0,,BC pharamserc Marburg,Marburg,0,0,0,0,0,0,0,,TV 1872 Saarlouis,Saarlouis,0,0,0,0,0,0,0,,Eisvögel USC Freiburg,Freiburg,0,0,0,0,0,0,0,,New Basket 92 Oberhausen,Oberhausen,0,0,0,0,0,0,0,,ChemCats Chemnitz,Chemnitz,0,0,0,0,0,0,0,,BBV Leipzig,Leipzig,0,0,0,0,0,0,0,,Trinos Göttingen,Göttingen,0,0,0,0,0,0,0,,Herner TC,Herne,0,0,0,0,0,0,0,,BC Wildcats Wolfenbüttel,Wolfenbüttel,0,0,0,0,0,0,0,,
```


----------



## zerix (9. Dezember 2009)

Hier hast du beispielsweise ein leeres Feld.

```
0,,BBV Leipzig,Leipzig
```
Zwischen der 0 und BBV
Am besten löst du es mit einer solchen Library, die ich dir oben gezeigt habe. Die sollten sowas berücksichtigen.

Gruß

Sascha


----------



## kimi (9. Dezember 2009)

hi sascha. ich habe die daten so geändert wie du gesagt hattest und es gibt keine fehlermeldung mehr . ich danke dir für deine hilfe.


----------

