If null Abfrage

Status
Nicht offen für weitere Antworten.

xyfreeman

Mitglied
Servus!

Ich will eine Methode schreiben, die abfragt, ob ein Knoten (in einem Binärsuchbaum) zwei Kinder hat.

Also dachte ich mir

Code:
if(actNode.getLeft() == null && actNode.getRight() == null){
...
}

müsste reichen. Allerdings passiert da einfach nichts bzw. wird wohl "false" zurückgegeben auch wenn die actNode wirklich keine Kinder hat!

Kann mir da jmd. sagen warum?

Ahja, Node sieht so aus:

Code:
 public Node(Node<T> parent, T item){
    this.parent = parent;
    this.rightchild = null;
    this.leftchild = null;
    this.item = item;
  }

Code:
public Node<T> getLeft(){
    return leftchild;
  }
 

xyfreeman

Mitglied
Habe jetzt schon alles mögliche durchprobiert, aber Java scheint recht unbeeindruckt.

Also ich hab's jetzt anders gelöst, indem ich nur einen Parameter der Node (Item) prüfe. Aber die Frage ansich bleibt im Raum und interessiert mich immer noch : )

Kann Java nichts damit anfangen, weil hier mehrere Parameter null sind und nicht nur einer?
 

xyfreeman

Mitglied
*seufz*

Habe das Problem auch bei

Code:
if(actNode.getLeft().getItem() == null && actNode.getRight().getItem() != null)

Das != null scheint Java nicht so aufzugreifen wie ich. Die Items sind vom generischen Typ T, aber für die gilt null doch auch oder nicht?
 

LordLuzifer

Aktives Mitglied
Hab mal das folgende probiert:

Code:
public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = new Object();
        System.out.println(o1 != null && o2 != null);
        o1 = null;
        o2 = null;
        System.out.println(o1 != null && o2 != null);
        System.out.println(o1 == null && o2 == null);
    }

und bekomme als Ergebnis

true
false
true

So sollte es sein, und genau das müsste mit deinem Node auch funktionieren. Bist du dir sicher, dass der Fehler nicht woanders liegt?
 

xyfreeman

Mitglied
Eigentlich schon. Ich poste mal was ich bisher habe. Möchte die delete Methode eines Binären Suchbaums schreiben.

Code:
 public void delete(T x){ 
  
  Node<T> preNode = root;
  Node<T> actNode = root;
  actNode = find(x);
  preNode = preFind(x);
  boolean flag = true;
    
//    while(flag){
      if(isInTree(x)){	
        if(actNode.getLeft().getItem() == null & actNode.getRight().getItem() == null){ 	      // 1.Fall
          if(x.compareTo(preFindGetItem(x)) < 0){
            preNode.setLeft(null);
//            flag = false;
//            break;
          }
          else if (x.compareTo(preFindGetItem(x)) > 0){
            preNode.setRight(null);
//            flag = false;
//            break;
          }
        }
      }
      if(isInTree(x)){  
        if(actNode.getLeft().getItem() == null && actNode.getRight().getItem() != null){		// 2.Fall
          if(x.compareTo(preFindGetItem(x)) < 0){												
            preNode.setLeft(actNode.getRight());												 
//            flag = false;
//            break;
          }
          else if (x.compareTo(preFindGetItem(x)) > 0){											
            preNode.setLeft(actNode.getLeft());
//            flag = false;
//            break;
          }
        }
      }
      if(isInTree(x)){
        if(actNode.getLeft().getItem() != null && actNode.getRight().getItem() == null){ 		
          if(x.compareTo(preFindGetItem(x)) < 0){												
            preNode.setRight(actNode.getRight());
//            flag = false;
//            break;
          }
          else if (x.compareTo(preFindGetItem(x)) > 0){											
            preNode.setRight(actNode.getLeft());
//            flag = false;
//            break;
          }
        }
      }
    }
//  }

Ignoriert die while Schleife. Damit wollte ich nur etwas testen.

Der Dritte Fall fehlt noch ganz (man muss ja die Suchbaumeigenschaften beachten, woraus sich 3 zu unterscheidene Fälle ergeben), weil die delete Methode für den zweiten Fall nicht funktioniert. Wobei plötzlich auch der erste Fall anders bearbeitet wird. Seit ich die delete Methode für den zweiten Fall erweitert habe...

*edit*

Mhm, du hast auch immer nur zwei Operatoren der selben Art. Vielleicht liegt es daran? Vielleicht kommt Java mit einmal != und einmal == nicht zurecht?
 

xyfreeman

Mitglied
Ich sehe gerade, Java beachtet nur den Code aus dem letzten Block. Heh? Habe ich etwas mit den If's falsch gemacht?
 

Der Müde Joe

Top Contributor
xyfreeman hat gesagt.:
Habe ich etwas mit den If's falsch gemacht?

Im ersten Fall würd ich noch ein && aus dem & machen....
Java macht da keine Fehler. Es gibt 4 möglichkeiten und nur eine kann stimmen:


Code:
public static void main(String[] args) throws Exception {
	Object o = new Object();
	Object nullO = null;

	if (o == null && nullO != null) {
		System.out.println("false");			
	}
	if (o == null && nullO == null) {
		System.out.println("false");			
	}
	
	if (o != null && nullO == null) {
		System.out.println("true");			
	}
	if (o != null && nullO != null) {
		System.out.println("false");			
	}
}
 

xyfreeman

Mitglied
Ahja, habe ich geändert. Auch zusätzlich den 3ten Fall eingefügt. Aber das Ergebnis ist das selbe.

Hier noch mal die geänderte Methode.

Code:
 public void delete(T x){ 
  
  Node<T> preNode = root;
  Node<T> actNode = root;
  actNode = find(x);							// Findet aktuellen (zu löschenden Knoten)
  preNode = preFind(x);							// Findet den davorliegenden
  
    if(isInTree(x)){	
      if(actNode.getLeft().getItem() == null && actNode.getRight().getItem() == null){ 		// 1.Fall
        System.out.println("Erster Fall läuft");
        size--;
        if(x.compareTo(preFindGetItem(x)) < 0){
          preNode.setLeft(null);
        }
        else if (x.compareTo(preFindGetItem(x)) > 0){
          preNode.setRight(null);
        }
      }
    }
    if(isInTree(x)){  
      if(actNode.getLeft().getItem() == null && actNode.getRight().getItem() != null){		// 2.Fall
        System.out.println("Zweiter Fall läuft A");
        size--;
        if(x.compareTo(preFindGetItem(x)) < 0){												// actNode ist links (gesehen von preNode)
          preNode.setLeft(actNode.getRight());												// und Nachfolger rechts
        }
        else if (x.compareTo(preFindGetItem(x)) > 0){										// Nachfolger links
          preNode.setLeft(actNode.getLeft()); }
      }
    }
    if(isInTree(x)){
      if(actNode.getLeft().getItem() != null && actNode.getRight().getItem() == null){ 		// actNode ist rechts (gesehen von preNode)
        System.out.println("Zweiter Fall läuft B");
        size--;
        if(x.compareTo(preFindGetItem(x)) < 0){												// und Nachfolger rechts
          preNode.setRight(actNode.getRight());  }
        else if (x.compareTo(preFindGetItem(x)) > 0){										// Nachfolger links
          preNode.setRight(actNode.getLeft());       }
      }
    }
    if(isInTree(x)){																		// 3. Fall
      if(actNode.getLeft().getItem() != null && actNode.getRight().getItem() != null){		// Sucht Linkes oder Rechts
        System.out.println("Dritter Fall läuft");											// Teilbaum Maximum oder Minimum
        size--;
        if(actNode.getItem().compareTo(root.getItem()) < 0 ){								// Und ersetzt x durch dieses
          actNode.setItem(leftMax());														// Löscht danach dieses Max/Min
          delete(leftMax());																// Wenn x = root
        }																					// Dann wird rechtes Min
        else if(actNode.getItem().compareTo(root.getItem()) > 0 ){							// genommen
          actNode.setItem(rightMin());
          delete(rightMin());
        }
        else{
         actNode.setItem(rightMin());
         delete(rightMin());
        }
      }  
    }   
  }

Ich muss ehrlich sagen, ich habe keine Ahnung. Und ich sitze jetzt schon verdammt lange davor :-/
Ich geb's auf.
 

Marco13

Top Contributor
Wenn du nicht aufgeben würdest, würdest du systematisch versuchen, rauszufinden, was dort schiefläuft. Z.B. mit
Code:
public void delete(T x){
 
  Node<T> preNode = root;
  Node<T> actNode = root;
  actNode = find(x);                     // Findet aktuellen (zu löschenden Knoten)
  preNode = preFind(x);                     // Findet den davorliegenden
 
  System.out.println("Deleting "+x);
  System.out.println("isInTree(x) "+isInTree(x));
  System.out.println("actNode.getLeft().getItem() "+actNode.getLeft().getItem());
  System.out.println("actNode.getRight().getItem() "+actNode.getRight().getItem());

    if(isInTree(x)){   
      if(actNode.getLeft().getItem() == null && actNode.getRight().getItem() == null){       // 1.Fall
        System.out.println("Erster Fall läuft"); 
     ....
oder es in einem Debugger angucken.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Datenbank Abfrage Exception Null Java Basics - Anfänger-Themen 2
Corben if Abfrage mit Division durch Null Java Basics - Anfänger-Themen 4
J Null Pointer Exception in der "ob Null"-Abfrage? Java Basics - Anfänger-Themen 37
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
W Null-Pointer trotz Konstruktor? Java Basics - Anfänger-Themen 9
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
P Buffer und null Java Basics - Anfänger-Themen 3
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
jakobfritzz Array- cannot invoke "" because "" is null Java Basics - Anfänger-Themen 4
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
N null in String replacen Java Basics - Anfänger-Themen 16
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
K Bufread.readLine())!= null wie beenden? Java Basics - Anfänger-Themen 4
C Variablen Provided text for message may not be null Java Basics - Anfänger-Themen 9
T ComboBox getValue() zeigt null Java Basics - Anfänger-Themen 7
J null exception Array Java Basics - Anfänger-Themen 5
tobikoch String x= null Bedeutung Java Basics - Anfänger-Themen 9
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
J Int wird als Null ausgegeben Java Basics - Anfänger-Themen 8
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
C Array auf Null-Inhalte prüfen Java Basics - Anfänger-Themen 9
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
M jTable bekommt null Java Basics - Anfänger-Themen 1
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
der_Schokomuffin Hilfe gesucht: String wird auf null gesetzt! Java Basics - Anfänger-Themen 17
L Warum ist Variable null? Java Basics - Anfänger-Themen 3
J javax.servlet.ServletException: Name is null Java Basics - Anfänger-Themen 7
B if(object== null) abkürzen? Java Basics - Anfänger-Themen 6
O JavaArray Null Java Basics - Anfänger-Themen 3
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
W NullPointerException obwohl nicht null? Java Basics - Anfänger-Themen 3
D Best Practice Konvention - Klassenmembers auf null setzen? Java Basics - Anfänger-Themen 2
I Null-Überprüfung durch Lambda-Expressions abkürzen Java Basics - Anfänger-Themen 8
Orkanson Null Pointer Expception Java Basics - Anfänger-Themen 3
M set Integer bzw. set null mit SQL DB Java Basics - Anfänger-Themen 9
I Polymorphie Null Objekt Java Basics - Anfänger-Themen 3
O Datentypen Integer mit führender Null Java Basics - Anfänger-Themen 13
DaCrazyJavaExpert Compiler-Fehler Variable nicht mit null initialisiert, trotzdem: NullPointerException Java Basics - Anfänger-Themen 28
J Einfache Frage zu "null" Java Basics - Anfänger-Themen 2
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
P Operatoren Parameter nicht auf null geprüft? Java Basics - Anfänger-Themen 16
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
C Null Pointer Exception Java Basics - Anfänger-Themen 10
V Elemente aus einem Array mit null überschreiben Java Basics - Anfänger-Themen 4
V String Array gegen null-Eintrag sichern Java Basics - Anfänger-Themen 11
G Null Pointer Exception Java Basics - Anfänger-Themen 4
R Gleitkommazahlen ohne führende Null Java Basics - Anfänger-Themen 10
M array = null Java Basics - Anfänger-Themen 2
F String equals NULL Problem Java Basics - Anfänger-Themen 4
F JSON null macht mir ein Problem Java Basics - Anfänger-Themen 3
R Property Value als null setzen Java Basics - Anfänger-Themen 1
D Arrays.toString spuckt null aus? Java Basics - Anfänger-Themen 3
T Compiler-Fehler Null type safety (type annotations) Java Basics - Anfänger-Themen 5
F Erste Schritte Unterschied: Array "leer" / "null" Java Basics - Anfänger-Themen 3
J Fehlerhafte Ausgabe "null" Java Basics - Anfänger-Themen 2
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
W Input/Output DataOutputStream gibt NULL zurück Java Basics - Anfänger-Themen 5
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
D OOP Warum bekomme ich eine Null-Pointer Exception!!? :( Java Basics - Anfänger-Themen 4
D Null Ausgabe obwohl wert zugewiesen Java Basics - Anfänger-Themen 5
J Alias null Java Basics - Anfänger-Themen 4
B Aliasing bei null-Objekten Java Basics - Anfänger-Themen 3
A null-Überprüfung Java Basics - Anfänger-Themen 24
O Methode gibt Null zurück Java Basics - Anfänger-Themen 7
D Methoden Implementieren von einer Zoomfunktion innerhalb eines JPanels mit null-Layoutmanager Java Basics - Anfänger-Themen 1
A Null Pointer Exception in Liste Java Basics - Anfänger-Themen 11
T Null Java Basics - Anfänger-Themen 3
X Array trotz Befüllung "null" Java Basics - Anfänger-Themen 11
P JavaFX Textfelder geben immer null zurück Java Basics - Anfänger-Themen 8
K Selbst renderndes Object auf null setzen Java Basics - Anfänger-Themen 1
L Null Pointer Exception bei setText Java Basics - Anfänger-Themen 9
D Methode die statt char[] ein "null" zurück gibt Java Basics - Anfänger-Themen 8
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
M Input/Output File.listFiles() gibt null zurück Java Basics - Anfänger-Themen 3
M Kann einen Array nicht füllen, im Nachhinein nur "null"-Werte Java Basics - Anfänger-Themen 11
J Verschränkte Rekursion und null Ahnung... Java Basics - Anfänger-Themen 0
X Vererbung Setzen auf Null bei Subklassen Java Basics - Anfänger-Themen 2
S Rückgabewert null in Methode mit Thread Java Basics - Anfänger-Themen 2
C MIME-Type null Java Basics - Anfänger-Themen 4
T Null Pointer Exception Java Basics - Anfänger-Themen 4
M toString gibt "null" statt "0.0" aus Java Basics - Anfänger-Themen 5
M Konstruktor auf null prüfen, Arrays Java Basics - Anfänger-Themen 9
G Null Pointer Exeption Java Basics - Anfänger-Themen 8
A If object != null funktioniert nicht Java Basics - Anfänger-Themen 2
N 'null' aus String löschen Java Basics - Anfänger-Themen 7
F Irgendein "Null" Fehler.... Java Basics - Anfänger-Themen 5
P Map liefert bei put null als Ergebnis Java Basics - Anfänger-Themen 6
M Interface Das Null-Layout Java Basics - Anfänger-Themen 12
M Problem mit null pinterexception beim laden von Bildern Java Basics - Anfänger-Themen 20
Dogge NumberFormatException null Java Basics - Anfänger-Themen 5
C 2 Objekte, 1 immer Null? Java Basics - Anfänger-Themen 8
H Mehrdimensionales Array - Inhalt auf Null überprüfen Java Basics - Anfänger-Themen 5
J db4o-attrbibutauslesen null Java Basics - Anfänger-Themen 9
MiMa Null Inhalte in Variablen Java Basics - Anfänger-Themen 28

Ähnliche Java Themen

Neue Themen


Oben