String-Array-Element wieder null zuweisen

misaki

Mitglied
So, nun wird mir doch alles zu kompliziert;:)rtfm:
Ich hab jetzt schon viel gegooglet und herumgesucht aber kaum etwas befriedigendes gefunden.
Es geht nun also um folgendes:
ich habe eine Klasse FiniteList, die Methoden definiert, mit denen man ein String-Array bearbeiten kann (z.B. Wörter hinzufügen und auch wieder löschen).
Diese Klasse möchte ich nun testen, aber sobald ich ein Wort hinzufügen will, bekomme ich diese NullPointerException.
Ich bin mir auch bereits ziemlich sicher, dass es damit zusammenhängt, dass ic hvorher überprüfe ob im Array überhaupt noch ein Platz ist.

Kann mir jemand helfen??:bahnhof:

Java:
public class FiniteList {
 
		//-----------------------------------------Instanzvariablen
		
		int laenge;
		boolean isFull = true;
		String[] liste;
 
		//-------------------------------------------------Methoden
		
		// Konstruktor ohne Eingabe einer Länge
		public FiniteList() {
			laenge = 10;
			String[] liste = new String[laenge];
		}
		
		// Konstruktor, wo Benutzer seine Länge eingegeben hat
		public FiniteList(int n) {
			if (n>0) {
			laenge = n;
			String[] liste = new String[laenge];
			}
			else {
			System.out.println("Kann kein Objekt erzeugen.");
			}
		}
		
		// fuegt s an erster freier Stelle ein; requires nicht voll
		public void add(String s) {
			if (isFull()==false) {
				for (int i = 0; i < 10; i ++) {
					if (liste[i] == null) {
						liste[i] = s;
						break; // Sobald ein leeres Feld gefunden wurde, wird dieses blegt und die Schleife soll abbrechen (nur einmal belegen!)
					}
				}
			}
			else {
			System.out.println("Array ist schon voll!");
			}
		}
		
		// entfernt (ein Vorkommen von) s, falls vorhanden, sonst wirkungslos; 
		public void remove(String s) {
			for (int i = 0; i < 10; i ++) {
				if (liste[i].equals(s)) {
					liste[i] = null;
				}
			}
		}
		
		public boolean isFull() {       // prueft ob Liste voll
			for (int i = 0; i < 10; i++) {
				if (liste[i] == null) {
					isFull = false;
				}
			}
			return isFull;
		}
		
		public void display() {        // druckt alle Strings in Liste; neue Zeile für jeden Eintrag
			int i = 0;
			while (liste[i] != null && i < 10){
				System.out.println(liste[i]);
				i++;
			}
		}
		
}

Java:
public class Bsp19 {
 
    public static void main(String[] args) {
		int laenge = 1;
		char choice;
		String s;
		
		// Erzeuge Array-Liste;
		System.out.println("Wollen Sie eine Länge für die Liste bestimmen? Geben Sie eine Zahl oder 0 ein, wenn die Länge automatisch bestimmt werden soll.");
		laenge = SavitchIn.readInt();
		FiniteList list = null;
		if (laenge != 0) {
			list = new FiniteList(laenge);
		}
		else {
			list = new FiniteList();
		}
		
		System.out.println("Um die Liste nun mit einem Wort zu befuellen geben Sie a(dd) ein.");
		System.out.println("Um ein Wort wieder zu loeschen geben Sie r(emove) ein.");
		System.out.println("Um sich die gesamte Liste anzeigen zu lassen geben Sie d(isplay) ein.");
		System.out.println("Um das Bearbeiten des Arrays abzuschliessen geben Sie e(nde) ein. Der Stand der Liste wird dann noch einmal ausgegeben.");
		do {
			choice = SavitchIn.readLineNonwhiteChar();
			if (choice == 'a') {
				System.out.println("Welches Wort moechten Sie der Liste hinzufuegen?");
				s = SavitchIn.readLine();
				list.add(s);
			}
			else if (choice == 'r') {
				System.out.println("Welches Wort moechten Sie von der Liste loeschen?");
				s = SavitchIn.readLine();
				list.remove(s);
			}
			else if (choice == 'd') {
				list.display();
			}
		}
		while (choice != 'e');
		
		list.display();
	}
}
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Deine Konstruktoren sind falsch
Java:
       String[] liste;
 
        //-------------------------------------------------Methoden
        
        // Konstruktor ohne Eingabe einer Länge
        public FiniteList() {
            laenge = 10;
            String[] liste = new String[laenge];  // <----
        }
        
        // Konstruktor, wo Benutzer seine Länge eingegeben hat
        public FiniteList(int n) {
            if (n>0) {
            laenge = n;
            String[] liste = new String[laenge];  //<--
            }
            else {
            System.out.println("Kann kein Objekt erzeugen.");
            }
        }

mit String[] liste = ... deklarierst du ein neues String Array, welches nur lokal sichtbar ist und dein andere Array überdeckt ! Lasse das String[] vor liste weg in den Konstruktoren
 

socialcocer

Mitglied
das erste was mir auffällt ist, dass du im konstruktor ne lokale variable vom typ string[] erstellst, anstatt sie der instanzvariable zuzuweisen (überschattung). indem fall steht in list nach den konstruktoraufruf null drin.

edit zu langsam :p
 

misaki

Mitglied
Hab gerade gesehen, es funktioniert nun eigentlich alles bis auf das Remove :)

Java:
 public void remove(String s) {
            for (int i = 0; i < 10; i ++) {
                if (liste[i].equals(s)==true) {
                    liste[i] = null;
                }
            }
        }

geht das denn dass ich einem Element einfach den Wert "null" zuweise - ist es dann leer? Oder löscht man den Wert normalerweise anders??

Gibt es übrigens noch eine andere Möglichkeit um zu vergleichen ?? oO In meiner Angabe steht eigentlich soll ich das mit isEqual machen ... aber Strings vergleicht man doch mit equals?
 

socialcocer

Mitglied
die sache mit der null-referenz ist so eine sache. zwar hast du keine referenz mehr auf das objekt, jedoch ist es die sache des garbage collectors, das objekt aus den hauptspeicher zu entfernen. könntest aber mit finalize() noch den dekonstruktor des objektes aufrufen.

natürlich kannst du objekte auch anders vergleichen, jedoch ist equals wohl der einfachste weg. Wieso sollte man sich den Umstand machen, wenn java so freundlich ist und dir equals "mitliefert".

Natürlich könntest du dir bei nen string die einzelnen char's holen und vergleichen ...
 
Zuletzt bearbeitet:

misaki

Mitglied
Ich möchte es nicht vollständig löschen, sondern nur, dass in dem einen Element des Arrays nichts mehr ist und es wieder "neu belegt" werden kann :)
 

socialcocer

Mitglied
naja man nicht einfach ein element eines arrays löschen, da sonst die gesamte datenstruktur zusammenbrechen würde, da im arbeitsspeicher die elemente alle nach einander liegen. kannst dem element nur nen "platzhalter" zuweisen, wie zum beispiel null.
 

freez

Top Contributor
Also was mir spontan auffällt, aber ich weiß nicht, ob es dein Problem löst: in add() und remove() iterierst du immer über 10 Elemente. Du verwendest dein Member "laenge" nicht. Das bedeutet, dass du komische Effekte bekommst, wenn du Längen != 10 im Konstruktor benutzt.

Ausserdem gehst du in remove() immer alle 10 Elemente durch. Wenn nun eines "null" ist, erhältst du durch aufruf von
Java:
liste[i].equals(s)
eine NullPointerException.

Ich finde es übrigens ok, wenn du einfach "null" setzt um ein Element zu löschen. Aber bedenke, dass du eine Liste erhälst, in der an jeder Stelle "null" stehen könnte. Somit musst du vor dem Aufrufen von irgendwelchen Methoden überprüfen, ob eine Objekt vorhanden ist (also != null). Ansonsten erhälst du, wie oben beschrieben, eine NullPointerException.
 
Zuletzt bearbeitet:

Murray

Top Contributor
Und "neu belegen" kannst Du die entsprechende Stelle im Array jederzeit - also auch ohne den alten Inhalt mit null zu überschreiben.
 

misaki

Mitglied
@freez
ja das hab ich shcon geändert:D aber danke

neu belegen weiß ich, dass ich es kann. aber ich muss ja wissen, ob das schon mal gelöscht wurde oder nicht ,denn sonst darf ich das nicht neu belegen.

also mal angenommen ich belege jetzt das element, das gelöscht werde nsoll als platzhalter mit "nix". Ich gehe davon aus, dass der Benutzer halt nie "nix" als String wählt, den er eingeben möchte.
Dann muss ich bei der Ausgabe so tun als stünde dort nix, also passiert das selbe wie bei null. Das funktioniert auch prima:
Java:
public void display() {        // druckt alle Strings in Liste; neue Zeile für jeden Eintrag
			int i = 0;
			while (i < laenge){
				if (liste[i] != null && liste[i].equals("nix") == false) {
					System.out.println(liste[i]);
				}
				i++;
			}
		}
wenn ich allerdings ein neues Wort hinzufügen möchte, muss der auch erkennen, dass "nix" praktisch Platz bietet - und mein Array noch nicht voll ist. Das macht er aber nicht :/ Irgendwo steckt der Hund in meiner "isFull"-Methode ... Wo ich aber auch überprüfe ob nix vorkommt oder nicht

Java:
public boolean isFull() {       // prueft ob Liste voll
			int i = 0;
			while (i < laenge) {
				if (liste[i] != null) {
					if (liste[i].equals("nix") == false) {
					isFull = true;
					}
					else if (liste[i].equals("nix") == true) {
					isFull = false;
					}
				}
				else {
					isFull = false;
				}
				i++;
			}
			return isFull;
		}

ich verzweifle noch;(

EDIT:
grad noch die änderung von freez gesehen.
also funktioniert das , wenn ich das element wieder null setze?? Das Element existiert weiterhin, nur ist es eben ungefüllt?
 

socialcocer

Mitglied
wenn wir jetzt schon dabei sind den code zu zerpflücken :D, möchte ich noch ergänzen, dass man generel parameter die referenzdatentypen sind (z.B String s) auf null zu überprüfen. Sonst würde der equal-aufruf mit s = null mit ner Exception enden.
 

freez

Top Contributor
Ja, meine Vorgehensweise wäre auch so. Wenn die Liste neu ist, ist jedes Element null. Fülle ich die Liste sind die belegten Plätze != null. Lösche ich eins, setze ich es null.

Deine Methode isFull() muss nur erkennen, ob jede Stelle != null ist.
 

misaki

Mitglied
dann müsste aber
Java:
public boolean isFull() {       // prueft ob Liste voll
			int i = 0;
			isFull = true;
						isFull = true;
			while (i < laenge && isFull == true) {
				if (liste[i] == null)
					isFull = false;
				i++;
			}
			return isFull;
		}
als Methode hierfür reichen oder?
Sobald ein Element aufritt, das null ist, wird isFull auf false gesetzt und die Schleife kann abbrechen.

Muss ich glatt nochmal probieren, hab den Code jetzt nämlich stark vereinrfacht vielleicht funktionierts sogar diesmal:oops:

EDIT: aaah es funktioniert!! ich danke euch allen:applaus::toll:
 

socialcocer

Mitglied
Java:
public boolean isFull() {       // prueft ob Liste voll
			int i = 0;
			isFull = true;
						isFull = true;
			while (i < laenge && isFull == true) {
				if (liste[i] == null)
					isFull = false;
				i++;
			}
			return isFull;
		}
Jop sollte funktionieren! :)
Nur mal kurz zum design:
habs mal isFull von nen bisschen unnötigen zeugs erleichtert..
Java:
public boolean isFull() {       // prueft ob Liste voll
			int i = 0;
			while (i < laenge) {
				if (liste[i] == null)
					return false;
				i++;
			}
			return true;
		}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Array-Element in String schreiben Java Basics - Anfänger-Themen 2
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
R Ein Multidimensionales String Array initialisieren und Deklarieren Java Basics - Anfänger-Themen 2
H Überprüfen ob String Array leer ist Java Basics - Anfänger-Themen 4
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
R String in char-Array übertragen Java Basics - Anfänger-Themen 5
P Datentypen Array und String Java Basics - Anfänger-Themen 2
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
A keine Ergebnisse - String nummer in array nummer converting Java Basics - Anfänger-Themen 1
Z Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) Java Basics - Anfänger-Themen 57
F Auto String mit Array Name aus Datei... oder so ähnlich Java Basics - Anfänger-Themen 4
J String aus einem Array entfernen Java Basics - Anfänger-Themen 10
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
S Nutzereingabe splitten und in string array wieder ausgeben. Java Basics - Anfänger-Themen 1
FelixN RegEx aus einem String als String-Array zurückgeben Java Basics - Anfänger-Themen 8
Curtis_MC 2dimensionales Array als String ausgeben Java Basics - Anfänger-Themen 2
I char Array to String Java Basics - Anfänger-Themen 3
I converting boolean Array to String Array Java Basics - Anfänger-Themen 10
M String array durch Eingabe begrenzen Java Basics - Anfänger-Themen 7
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
R Objekte aus Array als String + kommasepariert speichern Java Basics - Anfänger-Themen 12
scratchy1 Array sortieren und dann String-Repräsentation ausgeben Java Basics - Anfänger-Themen 2
E Array to String Method Reverse Java Basics - Anfänger-Themen 5
Mosquera Get String Array - ComboBox Java Basics - Anfänger-Themen 10
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
V zweidimensionale String Array Java Basics - Anfänger-Themen 1
J String, Int und double Array sortieren Java Basics - Anfänger-Themen 16
M Array nach String durchsuchen und zurückgeben Java Basics - Anfänger-Themen 16
J Klassen Zugriff auf ein "String Array" Java Basics - Anfänger-Themen 6
C Methoden String in char Array Java Basics - Anfänger-Themen 3
T Schauen ob eine Ziffer in einem String-Array häufiger vorkommt Java Basics - Anfänger-Themen 8
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
N String array to String Java Basics - Anfänger-Themen 6
informatikschüler21 String im Array sortieren Java Basics - Anfänger-Themen 4
B String in Array speichern Java Basics - Anfänger-Themen 4
L String zu String Array Java Basics - Anfänger-Themen 2
D Input/Output Array in einem String mit einem Trennzeichen verbinden Java Basics - Anfänger-Themen 17
D String-Array Java Basics - Anfänger-Themen 3
V String Array gegen null-Eintrag sichern Java Basics - Anfänger-Themen 11
K String in String-Array suchen Java Basics - Anfänger-Themen 11
K String Array basierend auf int Array füllen Java Basics - Anfänger-Themen 2
K Im String Array suchen Java Basics - Anfänger-Themen 8
D Elements[] string = document.getElementsByClass("betEvent"); als Array Java Basics - Anfänger-Themen 1
C Array in String umwandeln Java Basics - Anfänger-Themen 5
D Best Practice String aufbau - Char Array oder Anhängen Java Basics - Anfänger-Themen 11
M String Array mischen Java Basics - Anfänger-Themen 3
F Methoden Kontaktliste - String in einem Array suchen und ausgeben Java Basics - Anfänger-Themen 3
K String zu int Array Java Basics - Anfänger-Themen 3
B String auslesen und Stellen im Array speichern Java Basics - Anfänger-Themen 1
W Array in String und String in Array - falsche Ausgaben Java Basics - Anfänger-Themen 20
W String Array in Int umwandeln um auf Zahl zu überprüfen Java Basics - Anfänger-Themen 4
W Array nach String durchsuchen und Ausgeben Java Basics - Anfänger-Themen 8
B Binäre Suche in einem String Array Java Basics - Anfänger-Themen 10
K String in String-Array finden Java Basics - Anfänger-Themen 7
S Rückgabe-Array lässt sich nicht auslesen, LocalDate mit String Java Basics - Anfänger-Themen 3
J 2 String Arrays in neuem String Array verbinden Java Basics - Anfänger-Themen 4
S String zu quadratischen Array Java Basics - Anfänger-Themen 3
T Array mit String, Zahlen in If Saetze packen Java Basics - Anfänger-Themen 3
J Int Array und String in einer neuen Methoder übergeben Java Basics - Anfänger-Themen 7
S ArrayDeque zu String Array Java Basics - Anfänger-Themen 2
A Variablen String Array in einzelne Strings auspalten Java Basics - Anfänger-Themen 4
K Input/Output 6000 Zeilen einlesen und String-Array vergleichen? Java Basics - Anfänger-Themen 1
fLooojava String zu Array Java Basics - Anfänger-Themen 5
C Array List mit String vergleichen und Fehlermeldung ausgeben Java Basics - Anfänger-Themen 6
J array in String umwandeln Java Basics - Anfänger-Themen 1
J array in String umwandeln Java Basics - Anfänger-Themen 3
E Erste Schritte Array soll kleiner werdenden String erstellen Java Basics - Anfänger-Themen 5
D String-Array aus Tastatureingabe Java Basics - Anfänger-Themen 4
A Mehrdimensionalles Array in String ausgeben in Liste Java Basics - Anfänger-Themen 5
L String array mit split füllen Java Basics - Anfänger-Themen 14
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
A private string array Java Basics - Anfänger-Themen 5
W String / Int-Array Java Basics - Anfänger-Themen 13
C Doppelte Einträge aus String [] Array entfernen. Java Basics - Anfänger-Themen 5
T Sortieren/Suche klappt nicht ganz (String Array) Java Basics - Anfänger-Themen 2
B Werte über Scanner in ein 3 dim String Array schreiben Java Basics - Anfänger-Themen 7
T String in Array suchen Java Basics - Anfänger-Themen 9
G String einem String Array übergeben Java Basics - Anfänger-Themen 3
G String to Array Java Basics - Anfänger-Themen 2
P CSV Datei in String Array -> Split -> New Array Java Basics - Anfänger-Themen 2
U OOP Array vom Typ String > Inhalt ausgeben Java Basics - Anfänger-Themen 8
F Variablen String-Array wird ungewollt "überschreiben" Java Basics - Anfänger-Themen 7
J Zeichen aus String Array lesen Java Basics - Anfänger-Themen 13
S Länge eines Elements im String Array Java Basics - Anfänger-Themen 5
F Problem: Verschlüsselung von String in Array Fehler Java Basics - Anfänger-Themen 2
C Datentypen Zweidimensionales Array mit String und int Java Basics - Anfänger-Themen 3
J Array zu String Java Basics - Anfänger-Themen 13
B String Array in main() Java Basics - Anfänger-Themen 2
G String Array konvertieren in Integer Array? Java Basics - Anfänger-Themen 7
Junb String in Array speichern Java Basics - Anfänger-Themen 4
J Einem String-Array in einer for-Schleife Strings zuweisen - Klappt nicht in einer for-Schleife Java Basics - Anfänger-Themen 5
P String Sortieren in einem Array Java Basics - Anfänger-Themen 7
W String & Integer im Array Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben