# [[Ljava.lang.String;@3487a5cc - Problem



## Java-Insel (3. Sep 2012)

Hallo liebe Leute,
Ich habe eine schöne kleine Klasse geschrieben und habe jetzt, um zu testen, ob sie funktioniert, einfach mal ganz viele 
	
	
	
	





```
System.out.println(irgendwas);
```
's gesetzt. Eigenartigerweise kam dann aber 
	
	
	
	





```
[[Ljava.lang.String;@3487a5cc
```
 raus. Warum, kann ich nicht sagen. Ich habe auch keinen Ansatz, da weder ein Fehler beim Kompilieren kam noch beim ausführen... Und das Programm benutzte nur einen String-Array und Tokens (es handelte sich halt nicht um irgendwelche "zufälligen" Zeichen und Pfade zu Paketen oder sonst was...). Deshalb konnte ich auch nicht alles aufschreiben. Vielleicht könnt ihr ja aus dieser Meldung irgendwas folgern.

Hinweis: mit Eclipse habe ich diese Meldung bekommen, mit dem Terminal war die Zahl hinter dem "@" beim ersten mal ausführen:
	
	
	
	





```
f7e6a96
```
, dann wars wie beim Eclipse.


----------



## Gast2 (3. Sep 2012)

Das ist auch kein Fehler.
Du versuchst ein String Array auszugeben per System.out.println, leider bringen Arrays keine schöne toString() mit. Probier mal folgendes:

```
System.out.println(Arrays.toString(irgendwas));
```
(Falls irgendwas ein String[] Array ist).


----------



## Clayn (3. Sep 2012)

So wie ich das weiß, ist das die Speicheradresse des Objekts (in dem Fall ein Stringarray [man verzeihe mir falls das mit der Zahl falsch war]). Ein solcher Ausdruck kommt immerdann wenn es für das Objekt keine implementierung von 
	
	
	
	





```
toString()
```
 gibt. 
Was du im Falle von Arrays tun kannst ist 
	
	
	
	





```
Arrays.toString(irgendwas);
```
 zu nehmen und das in dein 
	
	
	
	





```
System.out.println()
```
 machen.

Das kein Fehler angezeigt wird ist klar, da man jedes Objekt per print anzeigen kann. Nur wird halt bei einigen ein solches Konstrukt gebildet was du da hast.

Edit zu meinem vorposter:
Es muss kein Stringarray sein um den weg zu gehn. Ein int[] geht genauso oder ein Array mit irgendeiner anderen Klasse die toString() überschreibt

Außerdem ist ein String[] Array doch ein 2 dimensionales Array oder?^^ Ist irgendwie doppeltgemoppelt aber das macht ja nichts. Fands nur amüsant


----------



## Java-Insel (3. Sep 2012)

Hmm. Ich hab's mal ausprobiert: In meinem String-Array (der übrigens zweidimensional ist) suche ich mir in den Methoden der Klasse Objekte raus u.s.w.. Die Methoden sollen die im Array enthaltenen Objekte wiedergeben. Also habe ich am Ende dieser Methoden 
	
	
	
	





```
MeinArray[x][y].toString();
```
 eingegeben. Bringt allerdings irgendwie nichts: Alles ist so wie vorher.:noe:


----------



## Murray (3. Sep 2012)

Java-Insel hat gesagt.:


> Also habe ich am Ende dieser Methoden
> 
> 
> 
> ...



Du solltest ja auch Arrays.toString( MeinArray) verwenden. Aber bei einem zweidimensionalen bringt auch das nicht den gewünschten Effekt (aber probiere es ruhig mal aus).
Für ein zweidimensionales Array wirst Du die Ausgabe selbst schreiben müssen - ist ja aber kein Hexenwerk:

```
for ( String[] strs : MeinArray) {
    System.out.println( Arrays.toString( strs));
}
```
Natürlich könnte man auf das Arrays.toString auch verzichten und stattdessen mit zwei verschachtelten Schleifen arbeiten.


----------



## Java-Insel (3. Sep 2012)

Ich glaube, wir haben uns da irgendwo falsch verstanden.
Ich möchte nämlich immer nur 1 Objekt aus dem Array auslesen.


----------



## Murray (3. Sep 2012)

Dann sollte 
	
	
	
	





```
System.out.println( MeinArray[x][y]);
```
 eigentlich funktionieren. Falls nicht: was liefert 
	
	
	
	





```
System.out.println( MeinArray[x][y].getClass().getName() + ": " + MeinArray[x][y]);
```


----------



## Java-Insel (3. Sep 2012)

@Murray: Es liefert 
	
	
	
	





```
java.lang.String
```
.
Vielleicht ist die Fehlerquelle ja auch eine andere, und zwar der StringTokenizer?


----------



## Mujahiddin (3. Sep 2012)

Java-Insel hat gesagt.:


> @Murray: Es liefert
> 
> 
> 
> ...



Ich verstehe dein Problem nicht.
Wenn es ein String ist, dann sollte es kein Problem geben... Was für ein StringTokenizer? Wie wärs, wenn du uns mal ein bisschen Code zeigst.

Übrigens, falls es ein mehrdimensionales Array ist, kann man auch die Methode 
	
	
	
	





```
Arrays.deepToString( myMultiDimArr )
```
 verwenden.


----------



## Java-Insel (3. Sep 2012)

Du hast mein Problem erfasst: Eigentlich müsste es keins geben!


----------



## Murray (3. Sep 2012)

Java-Insel hat gesagt.:


> @Murray: Es liefert
> 
> 
> 
> ...



Wenn die Ausgabe "java.lang.String: [[Ljava.lang.String;@3487a5cc" ist (wobei die Adresse natürlich variieren kann), dann hast Du ein Problem bei der Zuweisung, denn dann steht wirklich diese String-Repräsentation des Arrays in der einzelnen Zelle.


----------



## Mujahiddin (3. Sep 2012)

Also wirklich...

Wenn du keinerlei Ambitionen hast, Informationen herauszurücken, dann verdienst du auch keine Lösung deines Problems.

Wir sind Programmierer, keine Magier. Da hast du dich anscheinend im Forum geirrt.

Guck dir mal dein Thema an: "[[Ljava.lang.String;@3487a5cc - Problem"
Das ist die Ausgabe der toString()-Methode aus der Object Klasse für ein zweidimensionales String-Array. WAS soll das einem sagen? Die Lösung lautet: Statt 
	
	
	
	





```
System.out.println(myArr);
```
 eher 
	
	
	
	





```
System.out.println(Arrays.deepToString(myArr));
```
...

[EDIT]Nach einigem Lesen fällt mir auf... Du versuchst also einzelne Objekte auszugeben? Du gibst aber in diesem Fall ein GANZES String-Array aus. Du musst deinen Code überprüfen, ob du irgendwo System.out.println(myArray); hast statt System.out.println(myArray[x][y]);[/EDIT]


----------



## Murray (3. Sep 2012)

Da die Ausgabe mit getClass().getName() ja bereits gezeigt hat, dass das ausgegebene Objekt ein einfacher String (und kein Array) war, würde ich doch eher darauf tippen, dass der Fehler bei der Zuweisung steckt. Interessant wäre also die Stelle mit MeinArray[x][y]=...


----------



## Java-Insel (4. Sep 2012)

O.K., ich schreibe mal die implementierung auf:

```
public class HAtabelle {
String[][] m_HA;
        //"Tabelle" anlegen
        public HAtabelle(int Stunden) {
                m_HA = new String[7][Stunden];
        }
        //Einen String hinzufügen
        public void addHomework(int Tag, int Stunde, String HA) {
                m_HA[Tag][Stunde] = m_HA + "\n" + HA;
        }
        //Den String ersetzen
        public void setHomework(int Tag, int Stunde, String HA) {
                m_HA[Tag][Stunde] = HA;
        }
        //String löschen
        public void delHomework(int Tag, int Stunde) {
                m_HA[Tag][Stunde] = null;
        }
        //Genauen Part entfernen
        public boolean delHomework(int Tag, int Stunde, int Token) {
                //String "zerstückeln"
                StringTokenizer tokenizer = new StringTokenizer(m_HA[Tag][Stunde],"\n");
                try {
                        //vorspulen
                        for(int i=1; i<Token - 1; i++) {
                                tokenizer.nextToken();
                        }
                        //genau diesen String suchen...
                        StringBuilder rmHA = new StringBuilder(m_HA[Tag][Stunde]);
                        String suche = tokenizer.nextToken();
                        int i = rmHA.indexOf(suche);
                        //...und entfernen.
                        rmHA.delete(i, i + suche.length());
                }
                catch (NoSuchElementException e) {
                        return false;
                }
                return true;
        }
        //Ganzen String ausgeben
        public String getHomework(int Tag, int Stunde) {
                try {
                        return m_HA[Tag][Stunde].toString();
                }
                catch(Exception e) {
                        System.err.println(e);
                        return null;
                }
        }
        //Genauen Teil abfragen        
        public String getHomework(int Tag, int Stunde, int Token) {
                //String "zerstückeln"
                StringTokenizer tokenizer = new StringTokenizer(m_HA[Tag][Stunde],"\n");
                try {
                        //vorspulen
                        for(int i = 1; i < Token - 1; i++) {
                                tokenizer.nextToken();
                        }
                        //... und gewünschten String ausgeben.
                        return tokenizer.nextToken().toString();
                }
                catch(Exception e) {
                        System.err.println(e);
                        return null;
                }
        }
}
```
Und ja, es geht um Hausaufgaben.


----------



## Murray (4. Sep 2012)

Das Problem liegt hier:

```
//Einen String hinzufügen
        public void addHomework(int Tag, int Stunde, String HA) {
                m_HA[Tag][Stunde] = m_HA + "\n" + HA;
        }
```
Hier wird in eine Zelle des Arrays eine Verkettung aus der String-Repräsentation des ganzen Arrays mit einem Newline-Zeichen und dem übergebenen String geschrieben.
Gewünscht ist aber wohl, dass ein Newline und der übergebene String an den bestehenden Inhalt der Zelle angehängt werden.
Also etwa:

```
m_HA[Tag][Stunde] = (m_HA[Tag][Stunde] == null) ? HA : ( m_HA[Tag][Stunde]  + "\n" + HA);
```


----------

