# warum ArrayIndex Exception?



## Reiner (23. Dez 2014)

Hallo Leute!
Ich habe gerade mit Programmieren angefangen. Jetzt hab ich die Aufgabe, ein Programm zu schreiben, das Zahlen von der Kommandozeile ausliest und an eine Methode übergibt, welche diese Zahlen dann summiert.
Vorgabe: die int Methode muss die parameter  < (int [ ] a, int von, int bis) >  übernehmen.  Die Berechnung soll rekursiv erfolgen. 
Nun bastel ich hier ewig dran rum und kann auch kompilieren, bekommen nach Eingabe von Werten auf der Kommandozeile immer eine  " ArrayIndexOutOfBoundException " in Zeile 17 und 10  Warum???
Vielleicht kann jemand helfen, danke schonmal!


```
public class Summe{
	public static void main( String[] args){

		int von;
		int bis = args.length;
		int [] a = new int [bis];
			for(von =0; von < bis; von++)
				a[von] = Integer.parseInt(args[von]);

		System.out.println(rechnung(a, von, bis));
	}
	public static int rechnung(int[] a, int von, int bis) {
		if (von == a.length - 1) 
			return a[von];
		
		else{
			int result = a[von] + rechnung(a, von+1, bis);
			return result;
		}
	}
}
```


----------



## Flown (23. Dez 2014)

Mit welchem Parameter glaubst du das du deine Methode aufrufst?


----------



## Reiner (23. Dez 2014)

Ich denke, mit den parametern a [ ], von und bis aus der main methode


----------



## Flown (23. Dez 2014)

Angenommen du hast als args = [1, 2, 3];
Was sind die konkreten von a, von, bis?


----------



## Reiner (23. Dez 2014)

dann ist das Feld a[ ] , "von" sollte bei null anfangen und bis 2 laufen, "bis" ist 3.

Ich glaube ich erahne das Problem, nur fällt mir keine lösung ein. Ich glaube der von-Wert wird nicht so übernommen, wie ich mir das vorstelle.


----------



## Flown (23. Dez 2014)

2 Tipps:

- for Schleifen sollten private Zähler besitzen:

```
for(int i = von; i < bis; i++) {...}
```
- Rekursionen sollten Basisfälle auch abfangen: Was ist wenn von >= bis ist?

```
if (von >= bis) {
  return 0;
}
```

Der Methodenaufruf sollte dann in etwa so aussehen:

```
System.out.println(rechnung(a, 0, a.length));
```


----------



## Reiner (23. Dez 2014)

Danke schön!!! Die Tipps waren sehr hilfreich. Jetzt läuft es. Hier der fertige Code: 


```
public class Summe{
	public static void main( String[] args){

		int bis = args.length;
		int [] a = new int [bis];
			for(int i =0; i < bis; i++){
				a[i] = Integer.parseInt(args[i]);
			}
		System.out.println(rechnung(a, 0, a.length));

	}
	public static int rechnung(int[] a, int von, int bis) {
		if (von == a.length - 1) 
			return a[von];
		
		else{
			int result = a[von] + rechnung(a, von+1, bis);
		
		return result;	
		}
	}
}
```


----------



## Flown (23. Dez 2014)

1. Du verwendest deine bis Variable in deiner Methode nicht
2. Was ist wenn dein Array leer ist, was gibt dir deine Methode zurück?


----------



## Reiner (23. Dez 2014)

Ich kann statt a.length ja einfach "bis" nehmen in meiner methode. Was laut aufgabenstellung natürlich sinn macht. 
 Und wenn das array leer ist, gibts ne exception. Hab ich behoben, wie du weiter oben geschrieben hast. Danke!


```
public class Summe{
	public static void main( String[] args){

		int bis = args.length;
		int [] a = new int [bis];
			for(int i =0; i < bis; i++){
				a[i] = Integer.parseInt(args[i]);
			}	
		System.out.println(rechnung(a, 0, a.length));
	}
	public static int rechnung(int[] a, int von, int bis) {
		if (von >= bis)
			return 0;
		
		else{
			int result = a[von] + rechnung(a, von+1, bis);
		
		return result;	
		}
	}
}
```


----------

