# java.lang.ArrayStoreException



## rogi1 (8. Feb 2006)

Hi

```
Object[][] erg = new Object[zw.length][10];
                    .....

                    .....
                    String str[] = erg[i-2][j].toString().split("=");
                    str[1] = new String(str[1].toString().trim());

                    if(str[1].equals("no")){
                               erg[i-2][j] = new Boolean(false);  
                    }
                    else if(str[1].equals("yes")){
                              erg[i-2][j] = new Boolean(true);   
                    }
                    else{
                               erg[i-2][j] = str[1];
                    }
```
Gibt folgenden Fehler:

 erg[i-2][j] = new Boolean(....);   <--    java.lang.ArrayStoreException

Weis jemand warum??


----------



## SlaterB (8. Feb 2006)

API:
public class ArrayStoreException
extends RuntimeException

Thrown to indicate that an attempt has been made to store the wrong type of object into an array of objects. For example, the following code generates an ArrayStoreException:

     Object x[] = new String[3];
     x[0] = new Integer(0);

-----------------

wichtig sind manchmal auch die .. Zeilen..

wenn ich mich an die vorherigen Threads erinnere 
(schreib doch einfach alles in "rogis Fragen-Thread" statt für jedes Problem einen neuen zu eröffnen  )
dann nehme ich stark an dass du du irgendwo

erg_ = irgendein String[];

ausgeführt hast,

nun ist also erg ein String[] und da kannst du logischerweise keinen Boolean einfügen


testen kannst du dass durch eine Ausgabe:

System.out.println(erg[i-2].getClass());

Ausgabe "class [Ljava.lang.String;" -> String[]
Ausgabe "class [Ljava.lang.Object;" -> Object[]


------------

dann ist es vielleicht doch besser den Vorschlag von HeyMan zu folgen, und die Strings einzeln in das Object[] einzufügen


		Code:In die Zwischenablage kopieren


Object[][]  erg = new Object[zw.length];
for (int i=0;i<zw.length;i++) {
    String[] tmp  = (zw[i].split("\n\r"));
    erg[i] = new Object[temp.length];
    for (int j=0; j<tmp.length) {
       erg[i][j]       = tmp[j];
    }        
}


wenn die Strings im Object[] drin sind, kannst du sie ohne Probleme durch Boolean-Objeke ersetzen_


----------



## rogi1 (9. Feb 2006)

...wenn die Strings im Object[] drin sind, kannst du sie ohne Probleme durch Boolean-Objeke ersetzen
Kannst du mir das bitte genauer erklären??
Wird mit:
	
	
	
	





```
x[0] = new Integer(0);
```
kein neues Objekt erstellt und auf x[0] geschrieben? Wie ersetz ich dass dann??
bekomm ich mit new Integer(0); kein Objekt???
lg


```
Object[][] data = {
    {"Mary", "Campione",
     "Snowboarding", new Integer(5), new Boolean(false)},
    {"Alison", "Huml",
     "Rowing", new Integer(3), new Boolean(true)},
    {"Kathy", "Walrath",
     "Knitting", new Integer(2), new Boolean(false)},
    {"Sharon", "Zakhour",
     "Speed reading", new Integer(20), new Boolean(true)},
    {"Philip", "Milne",
     "Pool", new Integer(10), new Boolean(false)}
};
```
Wiren hier nicht auch verschiedene Datentypen einem Object zugewiesen???? Dann dürfte das ja nicht funktionieren.... tuts aber(beispielcode aus Internet...)

new Boolean(false) dürfte hier ein Object sein... oder??


----------



## SlaterB (9. Feb 2006)

rogi1 hat gesagt.:
			
		

> ...wenn die Strings im Object[] drin sind, kannst du sie ohne Probleme durch Boolean-Objeke ersetzen
> Kannst du mir das bitte genauer erklären??
> Wird mit:
> 
> ...


keine Ahnung wovon du redest, Integer(0) ist auch ein Objekt, ja,
wie und warum du das ersetzen willst?, keine Ahnung 

mit Ersetzen meinte ich deinen Code
erg[i-2][j] ist ein String, den liest du aus und willst am Ende ein Boolean an die gleiche Stelle schreiben
(erg[i-2][j]),
genau an die gleiche Position, daher "ersetzen",
das geht nur wenn an diese Position (erg[i-2][j]) ein beliebiges Objekt stehen darf, in einem Object[][] kein Problem,
bei dir schon, daher nehme ich an dass erg[i-2] kein Object[] ist sondern ein String[],

wie man das nachprüfen kann habe ich schon geschrieben, hast du aber ignoriert.. 

----------------------------------


erg ist ein Object[][]
damit ist erg[0] ein Object[]

es ist doch nun nur noch die Frage ob erg[0] wirklich genau ein Object[] ist mit Strings drin ist
(siehe Ende meines vorherigen Postes wie man das macht!)
oder ob erg[0] nicht eher ein String[] mit Strings drin ist,

beides ist erlaubt (ein String[] ist ja ein Object[]) aber im String[] kann man keine Boolean reintun während ein Object[] natürlich Boolean aufnehmen kann




[qutoe]
[..]
Wiren hier nicht auch verschiedene Datentypen einem Object zugewiesen???? Dann dürfte das ja nicht funktionieren.... tuts aber(beispielcode aus Internet...)

new Boolean(false) dürfte hier ein Object sein... oder??[/quote]
weiß nicht was du meinst, einem Objekt werden nicht verschiedene Datentypen zugewiesen,

in ein Object[] werden Objekte verschiedenen Typs hineingelegt, das ist Problem, denn sie sind ja alle Objekte und das Array setzt nur voraus dass alle Insassen Objekte sein müssen, klappt also

-----------------

das Problem ist doch ganz einfach:


```
Object[] a = null;

// 1. a = new String[2];
// 2. a = new Object[2];

a[0] = "test";
a[1] = new Boolean(false);
```

egal welche der beiden ausgeklammerten Zeilen verwendet wird, der Kompliler wird alles ok finden,
selbst wenn keine der beiden Zeilen ausgeführt wird 

wenn keine ausgeführt wird ist a null und es gibt zur Laufzeit ne NullPointerException,
wenn 1. ausgeführt wird gibts bei der Boolean-Zuweisung die ArrayStoreException
wenn dagegen 2. ausgeführt wird ist alles in Ordnung denn beide Objekte können in dem Object[] gespeichert werden


----------



## bygones (9. Feb 2006)

so am Rande:

NIEMALS new Boolean() nutzen !!! Man sollte sich über Boolean.TRUE bzw Boolean.FALSE die entsprechende werte holen !


----------

