# Array index out of bounds



## DerGroßeNargus (4. Nov 2010)

Hi,

ich möchte ein Vorhandenes Array (eindim.) in ein anderes Array (zweidim.) schreiben. Ich verstehe allerdings nicht, warum mir der folgende Fehler ausgegeben wird ???:L Habe schon diverse Möglichkeiten ausprobiert aber finde nicht den Grund des Fehlers:


```
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
	at test2.main(test2.java:60)
```


Hier der Ausschnitt des relevanten Java-Codes:

```
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int gecastet = 3;
double x = 3.16;
int i = 3;
```


```
if(gecastet<x) {
			// erzeugeArray[i][i+1] Spalte soll 1 groeser sein als es zeilen hat
			int zaehler = 0;
			int[][] zweiDimensional = new int[i][i+1];  // erzeugt zweidimarray[][]
			
		
			       for(int zeile = 0; zeile < i; zeile++ ) {
			    	   for(int spalte = 0; spalte < i+1 ; spalte++) {
			    		   
			    		  // das schreiben vom neuen array schiesst ueber das alte array hinaus!!!
			    		   
			    		   
			    		  zweiDimensional[zeile][spalte] = array[zaehler];
			    		  zaehler++;
			    		  
			    		// test zum ausgeben
                                       System.out.println("counter: "+ counter);
			    		  
			    	
			    		   
			    	   }
			       }
			
			
		}
```

Vielen Dank für die Hilfe


----------



## noobadix (4. Nov 2010)

Welchen Teil von "array index out of bounds" verstehst du denn nicht? 

zaehler wird in der oberen Schleife nicht "resettet", wird also größer als 9!

P.S.: woher soll man wissen wie groß i ist?


----------



## Monchi (4. Nov 2010)

Hallo Großer Nargus,

Ich habe das nicht so ganz verstanden. ???:L


```
int[] einDim = {1,2,3,4,5,6,7,8,9,10};

int i = 10; // Anzahl der Werte wie in einDim?
int[] zweiDim = new int[i][i+1];
```
einDim soll in zweiDim kopiert werden?

Ist das zu erwartende Ergebnis so?

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10


----------



## DerGroßeNargus (4. Nov 2010)

Sorry, "i" ist in dem Fall "3". Hab ich vergessen oben zu schreiben.


Das Ergebnis sollte so aussehen.
2DimArray:
1 2 3 4
5 6 7 8
9 10 - -

wobei die "-" leer bleiben sollen. Mein Problem ist jetzt, dass nach der 10 im Auszulesenden 1Dim array ja keine zahl mehr kommt, die geschrieben werden könnte. Habe allerdings keinen Plan, wie ich das umgehen soll.... auf "null" zu Prüfen macht wenig Sinn, oder?


----------



## Monchi (4. Nov 2010)

brecht die Schleife ab, wenn die Bedingung
einDim.length = zähler erfüllt ist.



```
if (zaehler < array.lenght)
{
    zweiDimensional[zeile][spalte] = array[zaehler];
    zaehler++;
}
else
    break;
```


----------



## DerGroßeNargus (5. Nov 2010)

Dankeschön! Hat geklappt!


----------



## Michael... (5. Nov 2010)

```
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int d1 = 3;
int d2 = d1 + 1;
				
int[][] zweiDimensional = new int[d1][d2];  
		
for (int i=0; i<array.length; i++)
	zweiDimensional[i/d2][i%d2] = array[i];
```

Noch 'ne kleine Anmerkung: In einem int Array gibt es keine leeren Felder, diese werden immer mit 0 initialisiert.


----------



## DerGroßeNargus (5. Nov 2010)

Ich möchte jetzt noch in der letzten Zeile das Array zweiDimensional als return Wert zurück geben.


```
int[][] zweiDimensional;

        if(gecastet<x) {

....
.... Code wie oben
....


                        // test zum ausgeben
                                       System.out.println("counter: "+ counter);
                          
                    
                           
                       }
                   }
            
            
        }
return zweiDimensional;
```

Warum klappt das nicht? Was muss ich anders machen?


----------



## noobadix (5. Nov 2010)

> Warum klappt das nicht? Was muss ich anders machen?



Zunächst wäre es schön, wenn du deine code-postings etwas sinnvoller gestalten könntest. Was das "klappen" betrifft...was genau "klappt" denn nicht?


----------



## DerGroßeNargus (6. Nov 2010)

Hi, habe alles nochmal bisschen umgeschrieben und jetzt ist aber wieder ein Fehler drin, den ich mir nicht erklären kann....


```
public static int[][] 1Dimzu2Dim(int[] input) {    // RETURN FEHLT NOCH !!!!!!!!
	
		
		

		int i = (int) Math.sqrt(input.length); 			 // zeile		
		int j = (int) Math.sqrt(input.length);			// spalte
			
	   if(input.length%i != 0) {
				j = j+1;	
	   }
			
			
			
	   int zweiDim [][] = new int [i][j];
	
	   int counter = 0;
	   
			for (int zeile = 0; zeile <= i; zeile++) 
				{	
					for(int spalte = 0; spalte < j; spalte++)
					{
						if (counter < input.length) {
							
						zweiDim[i][j] = input[counter];
					
						counter++;
						} else 
							break;
					}	

				}
	
	 return zweiDim;
  
		
	}
```

der Fehler ist


```
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at ArrayManipulator.convertArrayTo2D(ArrayManipulator.java:148)
	at ArrayManipulator.main(ArrayManipulator.java:21)
```

wobei zeile 148 diese ist:


```
zweiDim[i][j] = input[counter];
```

Wird der return so funktionieren?


----------



## ARadauer (6. Nov 2010)

> den ich mir nicht erklären kann


du darfst einfach nicht ausserhalb das arrays zugreifen.... vor der zeile wo der fehler passiert, gibst du dir die größe und die indizes mit denen du zugreifst aus, dann siehst du was nicht stimmt...


----------



## Michael... (6. Nov 2010)

i wird zu gross.
Nimm doch meine Variante, weniger for - Schleifen keine Überprüfung mittels if ==> weniger Fehlermöglichkeiten.


----------



## DerGroßeNargus (7. Nov 2010)

Auch bei deiner Möglichkeit kommt immer noch Out of Bounds.


----------



## Michael... (7. Nov 2010)

Bei einem variablen input Array muss natürlich mindestens d2 des "2D" Arrays korrekt berechnet werden.


----------

