Methodenabbruch

Joergel

Mitglied
Moin Leute,

ich brauche gerade mal Eure Hilfe, weil ich den Wald vor Bäumen nicht sehe. Ich habe eine Methode, die, ausgehen vom User.home rekursiv nach einem Dropbox-Verzeichnis sucht und dann darin nach einer bestimmten Datei. Das klappt auch soweit, aber wenn die Datei gefunden wurde bricht die Methode trotz return an der markierten Stelle nicht ab.
Bitte nicht schimpfen. Ich weiß, dass das nur eine blöde Macke sein kann, aber ich sehe sie einfach nicht.
Hier der Code:
Java:
private String searchDropBox(File home, String verznam) {
		if (!home.isDirectory()) {
			JOptionPane.showMessageDialog(this, home
					+ " ist kein Verzeichnis, bitte pr\u00FCfen Sie den Pfad!");
			return "";
		}

		String s = home + "/" + verznam;
		File file = new File(s);
                File[] files = home.listFiles();
		for (File f : files) {
			if (f.equals(file)) {
				System.out.println("Verzeichnis " + s + " gefunden");      // wird ausgegeben
				File sF = new File(s + "/" + saveFile);
				System.out.println("Suche " + sF + "...");
				String foundFile = sF.getAbsolutePath();
				if (sF.isFile()) {
					System.out.println("Speicherdatei " + foundFile
							+ " gefunden");                           // wird ausgegeben
					return foundFile;                                          // führt nicht zum Methodenabbruch
				}
			} else if (f.isDirectory() && f.canRead() && !f.equals(file)) {
				searchDropBox(f, verznam);
			}
		}
		return System.getProperty("user.home") + "/" + verznam + "/" + saveFile ;
	}
 
A

anonym

Gast
Das kann schlicht und ergreifend nicht sein. Vorschläge:

(1) Bist du dir sicher, dass du diesen Source kompiliert hast? Liegt noch irgendwo eine Vorgängerversion im classpath, die dort kein return hat? Änder mal den Text im print, ändert sich dann auch die Ausgabe?

(2) Setz mal ein System.out.println UNTER das return, ggf. muss dass dann auch unter das if, Zeile 24. Dann siehst du's.

(3) Guck dir mal an, wohin die Methode zurückspringt. Vielleicht verbirgt sich da noch was, was blöde Effekte hat?

(4) Ansonsten schnapp dir einen Debugger, setze einen Breakpoint über dem return und geh von da an schrittweise durch. Mit eclipse z.B.
 

Joergel

Mitglied
Zu 1: Ja, alles probiert, das ist die originale Version die da läuft. Änderungen am Sysout werden übernommen
zu 2:
Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Unreachable code
zu 3: Sie springt vom return in den else-body zu
Java:
searchDropBox(f, verznam);
und initiiert somit die Rekursion.
zu 4: das mache ich die ganze Zeit, arbeite nur mit Eclipse.
 

DarkLegend

Mitglied
ja das ding wird doch rekursiv aufgerufen...
mit einem return wird ja nur die aktuelle Methode beendet. Du landest danach natürlich wieder im else Zweig. Dort hattest du die Methode ja auch aufgerufen...


[ Edit]
Vielleicht noch mit Beispiel:

Der Callstack sieht ja dann so aus:

searchDropbox Zeile 23
searchDropbox Zeile 23
searchDropbox Zeile 23
searchDropbox Zeile 20

Und mit dem Return in Zeile 20 landest du dann wieder in Zeile 23 der darüberliegenden Methode.
 
Zuletzt bearbeitet:

Neue Themen


Oben