Variablen String-Array wird ungewollt "überschreiben"

fisch100

Mitglied
Hi liebe Java-Freunde!

Heute mal wieder etwas an meinem kleinem Projekt weitergearbeitet und bin nun auf einen Fehler gestoßen wo ich nicht weiß woran es liegt das hier etwas schief läuft. :/

Hier mal der Code:
Java:
public class KLASSE
{
String[][] inv = new String[40][15];

public KLASSE()
{
        for(int i = 0; i < 40; i++)
        {
            inv[i][0] = "null";
        }
}


public void clear(int pos)
    {
        this.inv[pos][0] = "null";
        System.out.println("clear " + pos);
    }
}

( mir ist klar das ich es auch auf null lassen hätte können - hatte aber die Hoffnung das der Fehler hier lag. )

Was ist hier der Fehler: es werden für inv auf den verschiedenen positionen (im ersten Array) sämtliche Strings(0-14) zugewießen.
Sobald ich aber clear ausführe, wird sporadisch jeder, der im zweiten Array auf pos 0 etwas anderes als "null" hat, auf "null" gesetzt - also ein komplettes löschen. Stelle ich den clear Ausdruck auf "gelöscht" bekommen eben alle welche kein "null" hatten eben auf "gelöscht".

Wie man ebenso sieht habe ich System.out.println verwendet um mir Sicherheit der richtigen Ausführung zu geben - und es war nicht die einzige Stelle wo sich soetwas fand. Jedoch ohne eine Erkenntnis zu dem Problem.

Hoffe ich hab es recht verständlich beschreiben und hoffe ihr habt Rat für mich 😉

lg fisch
 
Hi,

Java:
public class KLASSE
{
String[][] inv = new String[40][15];

public KLASSE()
{
        for(int i = 0; i < 40; i++)
        {
            inv[i][0] = "null";
        }
}


public void clear(int pos)
    {
        this.inv[pos][0] = "null";
        System.out.println("clear " + pos);
    }
}
[..]
Sobald ich aber clear ausführe, wird sporadisch jeder, der im zweiten Array auf pos 0 etwas anderes als "null" hat, auf "null" gesetzt - also ein komplettes löschen.
[..]

Die Variable
Code:
inv
(
Code:
String[][] inv = new String[40][15];
) ist genau ein zweidimensionales Array und nicht zwei Arrays. Um die einzelnen Elemente des Arrays (die Variable
Code:
inv
) anzusprechen, brauchst Du dann eben zwei Indizes. Mit der Zuweisung
Code:
 inv[i][0] = "null";
weist Du den Elementen mit dem zweiten Index 0 und dem ersten Index i eben allen den Wert "null" zu.
Ich würde mich sehr wundern, wenn Du nach einem Aufrufen der Methode
Code:
public void clear(int pos)
nur sporadisch den Wert "null" für das Element
Code:
inv[pos][0]
hast. Du musst immer den Wert "null" für das Element
Code:
inv[pos][0]
haben, eben weil Du dem Element
Code:
inv[pos][0]
mit
Code:
this.inv[pos][0] = "null";
genau "null" zuweist.

Grüße
Momolin
 
Zuletzt bearbeitet:
@Momolin, genau genommen sinds 41 Arrays 😉 Eins drum rum, und 40 weitere drin.
@TO, wie Momolin sagte, es passiert nichts sporadisch...
Warum brauchst du eigentlich dieses [c]"null"[/c] :boe: ?
Und niemals Dinge hardcoden, die man anders lösen kann: [c]for(int i = 0; i < 40; i++)[/c] -> [c]for(int i = 0; i < inv.length; i++)[/c]
 
ja das ist mir klar das für this.inv[pos][0] = "null"; der wert auf "null" gesetzt wird.
das Problem ist das zu 90% auch inv[X][0] auf "null" gesetzt wird, wobei X ALLE Anderen inv[] sind welche im inv[][0] etwas anderes als "null" eingetragen haben.

Also: inv[0][0] = "eins"; inv[1][0] = "zwei"; inv[2][0] = "drei";
ich führe nun clear aus -> und ALLE drei werden auf "null" gesetzt.

jedoch wird clear nur 1x ausgeführt, sprich ich hab eben keine Ahnung woher der Fehler kommt.

lg
 
immer, immer wieder unverständlich:
warum postest du keinen vollständigen Code, der das Problem zeigt?
der Code im ersten Posting bringt rein gar nichts, solange offensichtlich kein Fehler auftritt, clear() wird ja nichtmal aufgerufen

"Wie man ebenso sieht habe ich System.out.println verwendet" kommt also wenig zum Tragen,
bisher ist nichts genaues zu erkennen,
edit: an sich ist aber zumindest der Einsatz von System.out.println zu loben 😉

ein ganz vager Tipp:
man kann theoretisch an alle Stellen des zweidimensionalen Arrays dasselbe eindimensionale Array speichern:
inv[5] = inv[4];
dann würde eine Änderung an inv[5][0] auch inv[4][0] betreffen,
dann wären aber auch vorher alle schon derselbe eine Wert

aber sowas passiert eigentlich nicht mal eben nebenher..
 
Zuletzt bearbeitet von einem Moderator:
ein ganz vager Tipp:
man kann theoretisch an alle Stellen des zweidimensionalen Arrays dasselbe eindimensionale Array speichern:
inv[5] = inv[4];
dann würde eine Änderung an inv[5][0] auch inv[4][0] betreffen,
dann wären aber auch vorher alle schon derselbe eine Wert

sprich wenn ich inv[5] = inv[4]; und dann inv[5] = inv[3]; setzte und nun mit clear inv[5] auf "null" setzte, werden inv[4] und inv[3] ebenso auf "null" gesetzt weil sie gleichgesetzt worden sind?! sowas ist mir eigentlich noch nie passiert

ok - nach sofortigem überprüfen -> das ist der Fehler!

die frage ist nur wie kann ich das "gleichsetzten" der einträge verhindern?
gibt es da etwas elegantes außer jeden unterpunkt des arrays mit *alterwert* + "" zu übertragen?

lg
 
> sprich wenn ich inv[5] = inv[4]; und dann inv[5] = inv[3]; setzte und nun mit clear inv[5] auf "null" setzte,
> werden inv[4] und inv[3] ebenso auf "null" gesetzt weil sie gleichgesetzt worden sind?!

Vorsicht, genau aufpassen, nach dem ersten Befehl enthalten 5 und 4 dasselbe Array, 3 ist noch abweichend,
nach dem zweiten Befehl enthält 5 das Array von 3, aber davon ist 4 nicht betroffen, 4 wäre nun abweichend

mit normalen Variablen denken ist dazu vielleicht einfacher

---------

Array kopieren ist nur ein Methodenaufruf,
copy(x,y)
usw., die lange Schleife für die Einzelwerte steht maximal einmal in der Methode, nicht schlimm

gibt auch System.arraycopy(), falls wirklich nichts eigenes..
 

Neue Themen


Zurück
Oben