Brainlag: Warum fliegt diese NPE?

hdi

Top Contributor
Hi,

also im Nachhinein werd ich mir sicherlich denken :lol:, aber im Moment ist es einfach nur :bahnhof:.

Folgender Code (lasst euch nicht vom Thread stören, ist jetzt so aus meinem Programm rauskopiert):

Java:
		new Thread() {
		    public void run() {
			for (File root : File.listRoots()) {
			    // skip floppy disk drive
			    if (root.toString().equals("A:" + File.separator)) {
				continue;
			    }
			    if (root.exists()) {
				iterate(root);
			    }
			}
		    }

		    private void iterate(File root) {
			for (File file : root.listFiles()) {
			    if (file == null) {
				continue;
			    }
			    if (file.isDirectory()) {
				iterate(file);
			    }
			    System.out.println(file.getPath());
			}
		    }
		}.start();

Gibt bei mir folgendes:

C:\$Recycle.Bin
C:\autoexec.bat
C:\Boot\BCD
C:\Boot\BCD.LOG
C:\Boot\BCD.LOG1
C:\Boot\BCD.LOG2
C:\Boot\bootstat.dat
C:\Boot\cs-CZ\bootmgr.exe.mui
C:\Boot\cs-CZ
C:\Boot\da-DK\bootmgr.exe.mui
C:\Boot\da-DK
C:\Boot\de-DE\bootmgr.exe.mui
C:\Boot\de-DE
C:\Boot\el-GR\bootmgr.exe.mui
C:\Boot\el-GR
C:\Boot\en-US\bootmgr.exe.mui
C:\Boot\en-US\memtest.exe.mui
C:\Boot\en-US
C:\Boot\es-ES\bootmgr.exe.mui
C:\Boot\es-ES
C:\Boot\fi-FI\bootmgr.exe.mui
C:\Boot\fi-FI
C:\Boot\Fonts\chs_boot.ttf
C:\Boot\Fonts\cht_boot.ttf
C:\Boot\Fonts\jpn_boot.ttf
C:\Boot\Fonts\kor_boot.ttf
C:\Boot\Fonts\wgl4_boot.ttf
C:\Boot\Fonts
C:\Boot\fr-FR\bootmgr.exe.mui
C:\Boot\fr-FR
C:\Boot\hu-HU\bootmgr.exe.mui
C:\Boot\hu-HU
C:\Boot\it-IT\bootmgr.exe.mui
C:\Boot\it-IT
C:\Boot\ja-JP\bootmgr.exe.mui
C:\Boot\ja-JP
C:\Boot\ko-KR\bootmgr.exe.mui
C:\Boot\ko-KR
C:\Boot\memtest.exe
C:\Boot\nb-NO\bootmgr.exe.mui
C:\Boot\nb-NO
C:\Boot\nl-NL\bootmgr.exe.mui
C:\Boot\nl-NL
C:\Boot\pl-PL\bootmgr.exe.mui
C:\Boot\pl-PL
C:\Boot\pt-BR\bootmgr.exe.mui
C:\Boot\pt-BR
C:\Boot\pt-PT\bootmgr.exe.mui
C:\Boot\pt-PT
C:\Boot\ru-RU\bootmgr.exe.mui
C:\Boot\ru-RU
C:\Boot\sv-SE\bootmgr.exe.mui
C:\Boot\sv-SE
C:\Boot\tr-TR\bootmgr.exe.mui
C:\Boot\tr-TR
C:\Boot\zh-CN\bootmgr.exe.mui
C:\Boot\zh-CN
C:\Boot\zh-HK\bootmgr.exe.mui
C:\Boot\zh-HK
C:\Boot\zh-TW\bootmgr.exe.mui
C:\Boot\zh-TW
C:\Boot
C:\bootmgr
C:\BOOTSECT.BAK
C:\config.sys
Exception in thread "Thread-3" java.lang.NullPointerException
at Main$2$1.iterate(Main.java:88)
at Main$2$1.iterate(Main.java:93)
at Main$2$1.run(Main.java:82)


Ich versteh nich wie da ne NPE kommen kann, Zeile 82 ist
Code:
iterate(root);
Was ist hier null?

Thx
 
Also am Methodenaufruf selbst liegts bestimmt nicht. Wenn dann an irgendetwas in der Methode. Ich vermute mal, dass du keinen Zugriff/keine Berechtigung auf das Verzeichnis hast. Dann kann eine NPE fliegen.
 
Dann fliegt normalerweise aber eine SecurityException oder nicht?

Ich vermute eher, dass der Ordner leer ist.
Du rufst iterate noch einmal auf, z.B. mit C:/leer/
da in C:/leer/ keine Datei vorhanden ist (und kein Ordner) liefert file.listFiles() null und dann fliegt die Exception (was normal ist bei dieser Verwendung der For schleife)
 
Ich glaube eher dass da eine NPE Fliegt weil er ja ( im falle von keine leserechte ) über die Variable Root, die in diesem Moment
Java:
null
ist iteriert.
 
Hab ich gelesen, was ich auch gelesen habe ist:

Throws:
SecurityException - If a security manager exists and its SecurityManager.checkRead(java.lang.String) method denies read access to the directory

Ich bin dennoch der Meinung, dass ein leerer Ordner vorhanden ist und dadurch die NPE fliegt
 
Da steht doch ganz eindeutig:

The array will be empty if the directory is empty

Also nix mit [c]null[/c]. Und:

Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs

Also null, wenn der Pfad nicht existiert (was hier ausgeschlossen ist), oder wenn ein I/O-Fehler auftritt. Was hier der Fall ist. Da das Betriebssystem den Zugriff sperrt und nicht ein Java SecurityManager (was bei:

SecurityException - If a security manager exists and its SecurityManager.checkRead(java.lang.String) method denies read access to the directory

der Fall wäre).
 
im Selbsttest kann ich nun bestätigen was die anderen beiden gesagt haben, du hast schlicht keinen Zugriff auf den Ordner/die Datei

Zusatz:
The array will be empty if the directory is empty

😱 Schande über mich 😳 habs überlesen und aus dem Quellcode etwas falsches interpretiert...
 
Zuletzt bearbeitet:
Jo genau danke, also listFiles() liefert null, d.h. wohl I/O Error.
Kommt bei mir jetzt bei C:/Documents and Settings, wenn ich da drüber iterieren will.

Ist das so dass Java einfach nicht auf alles Zugriff bekommt? (Nichtmal lesend?)

Thx
 
Jo genau danke, also listFiles() liefert null, d.h. wohl I/O Error.
Kommt bei mir jetzt bei C:/Documents and Settings, wenn ich da drüber iterieren will.

Ist das so dass Java einfach nicht auf alles Zugriff bekommt? (Nichtmal lesend?)

Thx

Wenn der angemeldete User darauf keinen Zugriff hat, ja. Wobei Documents and Settings eigentlich problemlos funktionieren sollte.
 

Neue Themen


Zurück
Oben