# ArrayIndexOutOfBoundsException



## Grejak (8. Nov 2011)

Hallo ich habe ein Problem mit der Obengenannten Exception in dieser Methode:

```
public void load(String fileName){
		try{
			FileReader r=new FileReader(fileName);
			String ret=null;
			int c;
			while((c=r.read())!=-1){
				ret+=c;
			}
			if(ret!=null){
				ret=ret.substring(4);
				String[] col=ret.split(";");
				
				recipeName=col[0];
				
				String[] ingredients=col[1].split(",");
				for(int cnt=0;cnt<=ingredients.length;cnt++){
					this.ingredients.add(ingredients[cnt]);
					System.out.println(ingredients[cnt]);
				}
				String[] ingredientvalue=col[2].split(",");
				for(int cnt=0;cnt<=ingredientvalue.length;cnt++){
					this.ingredientValue.add(Integer.parseInt(ingredients[cnt]));
				}
				
				subscripe=col[3];
			}
			r.close();
		}catch(IOException ex){
			System.out.println("Error");
		}
	}
```
Sie lässt sich auf jeden Fall ausführen und ich glaube die Exception wird in den beiden Reihen mit split()


----------



## Marco13 (8. Nov 2011)

String[] col=ret.split(";");
System.out.println("Result of splitting '"+ret+"' is "+Arrays.toString(col));

EDIT: Und stimmt der Arrayzugriff in Zeile 22? Die Genaue Zeile steht auch im Stack Trace...


----------



## Grejak (8. Nov 2011)

?dann wird doch die E. immer noch ausgelöst???:L


----------



## nillehammer (8. Nov 2011)

In der Exception steht die genaue Zeilennummer drinnen, an der sie auftritt. Damit ist zweifelsfrei die Stelle in Deinem Code identifizierbar. Wir können das leider so nicht herausfinden, weil wir die Struktur der Datei nicht kennen, die Du einliest.


----------



## nillehammer (8. Nov 2011)

Marco13 hat's glaub ich entdeckt:
[Java]
for(int cnt=0;cnt<=ingredientvalue.length;cnt++)
[/Java]
Kann sein, dass schon vorher was schief geht, aber da wird auf jeden Fall eine solche Exception fliegen. Schreibe nicht "<=" sondern "<".


----------



## Grejak (8. Nov 2011)

Ungefähr so

Name;Einzelne,Dateien,bzw,Strings,;2,3,4,5,;Langer Text;


----------



## Grejak (8. Nov 2011)

Danke probiers mal aus

Glaube aber sie wird auch schon vorher ausgelöst


----------



## nillehammer (8. Nov 2011)

Danke für das "Danke"  Aber eigentlich hat Marco13 es verdient. :applaus:


----------



## Grejak (8. Nov 2011)

Stimmt hab den EDIT nicht gesehen


----------



## Grejak (10. Nov 2011)

Das problem besteht immernoch allerdings bin ich mir jetzt 500% sicher das es in den .split() passiert


Habe dies mit System.out.println("OK");
an verschiedenen stellen feststellen können


----------



## chalkbag (10. Nov 2011)

Prüfe doch einfach ob es col[1], col[2] ... gibt. Oder noch verrückter, du guckst mit dem Debugger was los ist oder sagst uns welche Zeile (wie im Fehler angegeben) die NullPointer wirft.


----------



## SlaterB (10. Nov 2011)

ein split() Aufruf hat noch auf der Welt bei irgendjemanden eine ArrayIndexOutOfBoundsException ausgelöst,
wenn überhaupt dann interpretierst du irgendwas falsch, weitere Befehle in der gleichen Zeile oder ähnliches

poste immer
- aktuellen Code, besser gleich vollständige Klasse,
- komplette Fehlermeldungen, bei Laufzeitexceptions StackTrace, und zwar idealerweise so dass man die Zeilenangaben nachvollziehen kann
- Dateien und Benutzereingaben möglichst durch Dummy-Strings im Programm ersetzen
- bei ungläubigen Nachfragen zu Fehlern helfen Screenshots


----------



## Grejak (11. Nov 2011)

Also ich glaube ich habe den fehler 
weiss aber nicht wie ich ihn beheben kann und zwar steht in der datei etwas völlig anderes als ich
hinein schreibe

Hier ist die komplete Ausgabe.


```
public class Recipe{

	private static final long serialVersionUID=1L;
	
	private String recipeName;
	private String subscripe;
	
	private Vector<String> ingredients=new Vector<String>();
	private Vector<Integer> ingredientValue=new Vector<Integer>();

public Recipe(){
		newRecipe();	
	}
	public Recipe(String fileName){
		load("resources/recipes/"+fileName+".dat");
	}
	public Recipe(String recipeName,String Subscripe){
		
	}
	
	public String toFileFormat(){
		String ret;
		ret=recipeName+";";
		
			for(ListIterator<String> it=ingredients.listIterator();it.hasNext();){
				String r=it.next();
				ret+=r+",";
			}
			ret+=";";
			for(ListIterator<Integer> it=ingredientValue.listIterator();it.hasNext();){
				int r=it.next();
				ret+=r+",";
			}
		ret+=";"+subscripe+";";
		System.out.println(ret);
		return ret;
	}
	
	public void load(String fileName){
		try{
			//Read the File
			FileReader r=new FileReader(fileName);
			String ret=null;

			int c;
			while((c=r.read())!=-1){
				ret+=c;
			}		
			ret=ret.substring(4);
			
			String[] col=ret.split(";");
			System.out.println(ret);
			
			String[] ingredients;
			String[] recipes;
			
			r.close();
			
		}catch(IOException ex){
			
		}
	}
	public void save(String fileName){
		try{
			FileWriter w=new FileWriter(fileName);
			w.write(toFileFormat());
			w.close();
		}catch(IOException ex){
			
		}
	}
```

Datei-inhalt:

Cheddar;grego,Cheddar,sdfg,;2,2,4,;Harry und Cheddar matschen alte Sahne;

Und das was ich erhalte wenn ich den ausgelesenen String ausprinte:

67104101100100971145910311410110311144671041011001009711444115100102103445950445044524
45972971141141213211711010032671041011001009711432109971161159910410111032971081161013
2839710411010159

???:L


----------



## Gast2 (11. Nov 2011)

read() liefert dir einen int zurück, und die ints hängst du alle hintereinander.
Leg um den FileReader noch nen BufferedReader und ruf readLine() auf.


----------



## Grejak (11. Nov 2011)

In einer anderen load() Methode funktioniert dies aber!

Kannst du mir mal den Code davon ungefähr zeigen?


----------



## Gast2 (11. Nov 2011)

Eine einfache Lösung ohne BufferedReader wäre folgende:

```
ret+= (char)c;
```
Eine Lösung mit BufferedReader findest du sicherlich auch bei Google oder in der Insel.


----------



## Grejak (12. Nov 2011)

danke es hat Funktioniert 

keine probleme mehr


----------

