Java++: Java Pass by Reference

Hi,

ich programmiere gerade etwas in Java und kriege eine NullPointerException.

FolgenderCode ist wichtig:

private void checkTree(JTreePanelNode current, JTree dest) {  
		for (int i = 0; i < current.getChildCount(); i++) {  
			JTreePanelNode node = (JTreePanelNode) current.getChildAt(i);  
  
			if (!(node.getState() == JTreePanelNode.State.FOLDER)) {  
				if (!isExistent(node, dest)) {  
					node.setState(JTreePanelNode.State.BAD);  
				}  
			}  
  
			System.out.println(node.getState());  
			checkTree(node, dest);  
		}  
	}  
  
	private boolean isExistent(JTreePanelNode search, JTree dest) {  
		JTreePanelNode root = (JTreePanelNode) dest.getModel().getRoot();  
		return searchTree(root, search);  
	}  
  
	private boolean searchTree(JTreePanelNode root, JTreePanelNode search) {  
		for (int i = 0; i < root.getChildCount(); i++) {  
			JTreePanelNode current = (JTreePanelNode) root.getChildAt(i);  
  
			if (current.getName().equals(search.getName())) {  
				boolean isDifferent = false;  
				for(String key : current.getHashes().keySet()) {  
					if(current.getHashes().get(key) != search.getHashes().get(key)) {  
						isDifferent = true;  
					}  
				}  
  
				System.out.println("TEST: " + current.getState() + " bool: " + isDifferent);  
				if(isDifferent) {  
					current.setState(JTreePanelNode.State.DUNNO);  
				}  
				else {  
					current.setState(JTreePanelNode.State.GOOD);  
				}  
				System.out.println("TEST2: " + current.getState());  
				  
				return true;  
			}  
			if (searchTree(current, search)) {  
				return true;  
			}  
		}

checkTree() ruft die beiden anderen gezeigten Funktionen auf. Hierbei geht es nur darum den Inhalt von node so zu verändern, wie ich ihn später benötige. Laut http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value ist Java pass by value, dementsprechend wird die Referenz übegeben und somit müssten alle 3 Funktionen jeweils auf dem selben Objekt arbeiten. Obwohl ich Funktion 1 aufrufe und diese die Arbeit an Funktion 3 weitergibt und in Funktion 3 der State von dem Node geändert wird, hat Node wieder einen anderen State (nämlich null) in Funktion 1, wenn Funktion 3 fertig ausgeführt ist.

Warum ist das so, wenn sie doch alle auf dem selben Objekt arbeiten?

Danke!

  1. Tach!

    ich programmiere gerade etwas in Java und kriege eine NullPointerException.

    Das Mindeste wäre die Angabe, an welcher Stelle die Exception geworfen wird. Weiterhin gibt es für Java eine Menge Entwicklungsumgebungen, die einen Debugger eingebaut haben. Mit dem kann man sehr schön nachvollzieehn, was da wie passiert. Inklusive dem Anzeigen der Variableninhalte. Auch den Aufruf-Stack kann man sehen, was nicht nur bei rekursiven Aufrufen hilfreich ist.

    Laut http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value ist Java pass by value, dementsprechend wird die Referenz übegeben und somit müssten alle 3 Funktionen jeweils auf dem selben Objekt arbeiten.

    Dieser Satz widerspricht sich, so wie er dasteht. Objekte werden als Referenz übergeben. Die Referenz auf das Objekt aber als Value. Das heißt dass das Objekt selbst nicht kopiert sondern durchgereicht wird, aber der Verweis darauf wird kopiert. Praktisch ist das in der Regel nicht weiter wichtig. Man kann auf die Objekteigenschaften zugreifen. Das ist das, was man üblicherweise will. Aber das Objekt komplett ersetzen geht nicht, wenn man nur eine Kopie der Referenz hat. Man bearbeitet dann nur seine Kopie der Referenz und nicht andere, anderswo existierende Kopien.

    Obwohl ich Funktion 1 aufrufe und diese die Arbeit an Funktion 3 weitergibt und in Funktion 3 der State von dem Node geändert wird, hat Node wieder einen anderen State (nämlich null) in Funktion 1, wenn Funktion 3 fertig ausgeführt ist.

    Dein Code ist nicht nachvollziehbar, weil man deinen Datenbestand nicht hat, mit dem du das Problem hast. Und deine Beschreibung deutet nur vage auf die Problemstelle hin. Das erzeugt bei den Hilfswilligen einen hohen Aufwand. Deswegen kann ich dir nicht mehr als die allgemeine Emfehlung des Debuggers geben.

    dedlfix.

  2. Moin,

    in der Funktion checkTree setzt du den Status einer Node aus "current" und in der Funktion searchTree setzt du den Status einer Node aus "dest". Ich vermute mal, dass dies so nicht gedacht war. Die Funktion isExistent tauscht den ersten und zweiten Parameter.