2016-07-09 8 views
-4

Klasse gedruckt wird. Es gibt eine Methode arrange() genannt. Wenn ich irgendeinen Knotenwert innerhalb der arrange() Methode drucke, kommt der Wert genau, aber wenn ich die Methode print() in tree Klasse verwende, bekomme ich eine NullPointerException. Bitte helfen Sie!Ich verstehe nicht, warum alle Daten in der Methode arrange korrekt gedruckt, aber nicht in der Druckmethode

public class Node { 
    Node lnode; 
    Node rnode; 
    int data; 

    public Node(String d) { 
     data = Integer.parseInt(d); 
     this.rnode = null; 
     this.lnode = null; 
    } 
} 

public class tree { 

    public void arrange(String s[], int n, Node r) { 
     Node root = new Node(s[0]); 
     for (int i = 1; i < n; i++) { 
      r = root; 
      if (Integer.parseInt(s[i]) > root.data && root.rnode == null) { 
       root.rnode = new Node(s[i]); 
      } else if (Integer.parseInt(s[i]) < root.data && root.lnode == null) 
       root.lnode = new Node(s[i]); 

      while (!(r.rnode == null) && (Integer.parseInt(s[i])) > r.data) { 

       r = r.rnode; 
       if (Integer.parseInt(s[i]) > r.data && r.rnode == null) 
        r.rnode = new Node(s[i]); 
       else if (Integer.parseInt(s[i]) < r.data && r.lnode == null) 
        r.lnode = new Node(s[i]); 
      } 
      while (!(r.lnode == null) && (Integer.parseInt(s[i])) < r.data) { 
       r = r.lnode; 
       if (Integer.parseInt(s[i]) > r.data && r.rnode == null) 
        r.rnode = new Node(s[i]); 
       else if (Integer.parseInt(s[i]) < r.data && r.lnode == null) 
        r.lnode = new Node(s[i]); 

      } 
     } 
     System.out.println(root.rnode.data); 
    } 

    public void print(Node r) { 
     System.out.println(r.rnode.data); 
    } 

} 

Hauptmethode:

Node root; 
int n; 
System.out.println("Enter the number of elements you want to enter into the bst: "); 
Scanner sc = new Scanner(System.in); 
n = Integer.parseInt(sc.nextLine()); 
System.out.println("Enter the elements you want to enter into the bst: "); 
Scanner s = new Scanner(System.in); 
String st[] = new String[n]; 
st = s.nextLine().split(" "); 
root = new Node(st[0]); 
tree t = new tree(); 
t.arrange(st, n, root); 
t.print(root); 
+0

Der in die Druckmethode übergebene Knoten ist eindeutig null. – duffymo

+0

Nein der Wert von root ist in der Hauptmethode angegeben –

+0

Wo _call_ 'print()'? –

Antwort

0

Die Variablen root ist ein Verweis auf ein Node Objekt, das von Wert zu der arrange Methode übergeben wird. Das bedeutet, dass jede von Ihnen vorgenommene Zuweisung an r innerhalb arrange (dh jedes Mal, wenn Sie den Operator = verwenden) nur so lange dauert, wie Sie innerhalb dieser Methode bleiben.

Wenn Ihre Methode zurückkehrt, ist der Wert root derselbe wie zuvor und löst somit Ihre NullPointerException aus, wenn Sie versuchen, auf r.rnode.data zuzugreifen.

Jetzt, da Sie das Problem kennen, würde ich vorschlagen, dass Sie versuchen, eine Lösung auf eigene Faust zu finden. Wie die Kommentare andeuten, ist es nicht so schwierig!

+0

Wie kann r.rnode.data außerhalb der Methode arrange zugreifen? Soll ich beim Zuweisen des Werts einen separaten Knoten erstellen (dh jedes Mal, wenn Sie den Operator = verwenden)? –

+0

Es ist nicht klar, worauf Sie abzielen. Sollte die 'arrangieren' Methode den' r' Parameter modifizieren? In diesem Fall können Sie keine Zuweisungen verwenden, aber Sie können weiterhin 'r' Mitgliedsvariablen ändern (siehe [link] (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass) -by-Wert)). Sollte die 'arrangieren' Methode etwas berechnen? Dann das Ergebnis zurückgeben. – burubum