Ich bin neu im Forum und in auch bei programmieren mit Java, bzw. programmieren allgemein.
Meine Aufgabe besteht darin, eine Klasse zu schreiben, die Arrays vom Typ String erzeugen kann. In dieses Arrays soll ich Zeichenketten speichern und wieder löschen können, und auch nach spezifischen bestehenden Einträgen suchen können. Dazu hab ich jeweils eine eigene Methode geschrieben, die jeweils zunächst, so zumindest ist die Idee, die eingegebene Zeichkette auf Gültigkeit überprüfen. Ungültige Eingaben sollen leere Zeichenketten sein, Zeichenketten die nur aus Leerzeichen bestehen, oder die Angabe null.
Java:
publicboolean add (String value){//Überpüft value auf gültige Eingabewerte.if(value.isEmpty()==true|| value.equals(null)){System.out.println("Bitte geben Sie einen gültigen Namen ein");returnfalse;}
Das habe ich jeweils an den Anfang der Methode gesetzt. Mein Gedanke war, wenn ich jetzt null eingebe, würde mir das Programm false zurückgeben. Das Programm compiliert auch, aber wenn ich die Methode aufrufe und null eingebe, springt BlueJ (damit sollen wir arbeiten) wieder in meinen Quellcode und spuckt mir den Fehler java.lang.NullPointerException: null aus.
Wie schaffe ich es jetzt also, dass ich null nicht eingeben kann und mein Programm läuft. Der Rest des Programms funktioniert wunderbar.
publicboolean add (String value){//Überpüft value auf gültige Eingabewerte.if(value==null|| value.isEmpty()){System.out.println("Bitte geben Sie einen gültigen Namen ein");returnfalse;}//...}
Bitte immer den kompletten StackTrace posten und sagen in welcher Zeile der Fehler passiert.
Die Exception besagt das etwas nicht initialisiert wurde du es aber verwenden willst.
In deinem Code sehe ich ein Problem:
Java:
publicboolean add (String value){//Überpüft value auf gültige Eingabewerte.if(value.isEmpty()==true|| value.equals(null)){System.out.println("Bitte geben Sie einen gültigen Namen ein");returnfalse;}
Du prüfst zuerst ob der Parameter "value" leer ist und dann erst ob der Parameter überhaupt initialisiert (!= null) ist.
Außerdem vergleicht "equals" den Inhalt, du solltest aber prüfen ob der Parameter etwas referenziert.
Es funktioniert! (Mit einer kleinen Einschränkung)
Was mich wundert ist, dass ich den Abgleich vorher auch mit dem ==-Operator statt mit .equals versucht habe. Das hatte auch nicht funktioniert. Warum macht die Reihenfolge der Befehle hier so einen großen Unterschied?
Zum noch bestehenden "Fehler":
Das Programm macht was es soll, gibt aber auf der Konsole (im unteren Teil) zusätzlich
java.lang.NullPointerException
at StringSet.remove(StringSet.java:107)
aus. Zeile 107 ist bei mir eben genau die besagte if-Abfrage, allerdings in der Methode zum Löschen von Namen. Dabei ist egal welche Methode ich aufrufe, BlueJ meckert immer bei Zeile 107. Egal ob ich jetzt versuche einen Namen in das Array einzutragen, ihn zu löschen oder ihn suche.
Was mich wundert ist, dass ich den Abgleich vorher auch mit dem ==-Operator statt mit .equals versucht habe. Das hatte auch nicht funktioniert. Warum macht die Reihenfolge der Befehle hier so einen großen Unterschied?
Du hast hier eine logische oder-Verknüpfung. Wenn der erste Ausdruck true ist, wertet Java den 2.Ausdruck gar nicht mehr aus. Egal was dort rauskommt der komplette Ausdruck ist true.
Bei einer logischen und-Verknüpfung hingegen wird jeder Teilausdruck ausgewertet.
java.lang.NullPointerException
at StringSet.remove(StringSet.java:107)
aus. Zeile 107 ist bei mir eben genau die besagte if-Abfrage, allerdings in der Methode zum Löschen von Namen. Dabei ist egal welche Methode ich aufrufe, BlueJ meckert immer bei Zeile 107. Egal ob ich jetzt versuche einen Namen in das Array einzutragen, ihn zu löschen oder ihn suche.
Dann zeig doch mal den Code her der die Methode "remove" der Klasse StringSet aufruft und wenn möglich auch den Code der Methode "remove" aus der Klasse StringSet
/**
* Methode um einen bestehenden Eintrag im Array stringOne zu löschen.
*
* @param value
* Ersetzt die eingegebene Zeichenkette durch null,
* falls sie im Array stringOne existiert.
*/publicboolean remove (String value){//Überpüft value auf gültige Eingabewerte.if(value ==null|| value.isEmpty()){System.out.println("Bitte geben Sie einen gültigen Namen ein");returnfalse;}//Wenn die eingegebene Zeichenkette gefunden wird,//wird sie mit null überschrieben, es wird true zurückgegeben//und die gesamte Methode wird dadurch abgebrochen.for(int i =0; i < stringOne.length; i++){if(stringOne[i]== value.trim()){
stringOne[i]=null;System.out.println("Sie wurden erfolgreich ausgetragen");returntrue;}}//Wird die Zeichenkette nicht gefunden, so wird false zurückgegeben.System.out.println("Dieser Name wurde nicht gefunden");returnfalse;}
Das ist die gesamte Methode um einen Namen zu löschen. Testklassen haben wir erst demnächst, also musste ich bislang manuell testen. Bis auf die Saceh mit null schien alles zu funktionieren.
ich sehe hier zwei Probleme!
Zum einen fällt stringone von Himmel (sprich: ist nicht deklariert) und dann erfolgen inhaltliche Stringvergliche noch immer ".equals()" und nicht mit "=="
Obwohl es weiter schon erwähnt wurde:
mit ".equals()" vergleichst du den Inhalt von Strings, mit "==" die Gleichheit der Objektreferenz !!
Hier noch mal zum nachlesen: http://www.java-blog-buch.de/0302-strings-vergleichen/
Ich bekomme quasi einen anderen. In beiden Fällen kompiliert das Programm. In meiner ursrünglichen Version hat BlueJ immer wenn ich die Methode aufgerufen habe nichts gemacht, außer den Quelcode der Klasse zu öfnnen und die eingangs beschriebene Fehlermeldung auszugeben, wo mir auch immer Syntaxfehler und ähnliches angezeigt werden.
Nach der Änderung läuft die Methode durch, funktioniert also. Auf der Konsole wird allerdings nicht nur der Text des println-Befehls ausgegeben, sondern auch im unteren Teil der Konsole die zweite beschriebene Fehlermeldung. Diesmal auch mit dem Hinweis wo der Fehler ist, halt in Zeile 107, also der if-Abfrage der Methode remove. Auch wenn ich null versuche mit einer anderen Methode in das Array einzutragen.
stringOne fällt nicht vom Himmel
Hoffe ich jedenfalls...
stringOne ist der Name des Arrays, in das ich Einträge machen möchte. Es wird am Anfang der Klasse, noch vor dem Konstruktor definiert. Wobei erst im Konstruktor die Länge des Arrays festgelegt wird. Beim kopieren des Codes wurde leider etwas nicht übernommen.
Beim kopieren des Codes wurde leider etwas nicht übernommen.
hinter stringOne steht noch ein i in eckigen Klammern. Es sollte also der Eintrag im Array stringOne an der Stelle i durch null ersetzt werden.
dann solltest Du das auch posten ... hier wird nämlich der Hase im Pfeffer liegen
da stringOne also außerhalb der Methode remove deklariert wird, würde ich eine Kiste Bier gegen eine Tasse abgestandenes Wasser wetten, dass stringOne eben genau NULL ist und dadurch Deine Exception fliegt.
Warum prüfst Du dass nicht ganz simpel im Debugger?
Und poste mal den gesamten Code! Diese Rumraterei beringt doch nix