2010-12-17 20 views
2

Nicht reproduzierbarer Absturz (kein Fehler/Ausnahme). passiert, wenn ich einen Dialog ausführen, um einen Ordner nur 1 von 10 Mal auszuwählen. Code:1/10 Mal java stürzt bei JFileChooser.showOpenDialog ab

public String getFilePathFromDialog(String dialogTitle) { 
    JFileChooser fileChooser; 
    fileChooser = new JFileChooser(); 
    fileChooser.setDialogTitle(dialogTitle); 
    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
    fileChooser.setAcceptAllFileFilterUsed(true); 
    if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { 
     return fileChooser.getSelectedFile().toString(); 
    } else { 
     return ""; 
    } 
} 

Es stürzt meine Anwendung. Danach kann ich schließen Sie es nur mit: Strg + Alt + Entf -> Task-Manager -> es töten -> Dann habe ich und ich traf Schaltfläche Schließen

bekommen "Java (TM) Platform SE binary nicht reagiert"

Mache ich etwas falsch oder ist es ein Fehler?

Ich fand die Crash-Dump-Datei als Peter unten erwähnt. Hier sind einige davon:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x62a5ff52, pid=5516, tid=5312 
# 
# Problematic frame: 
# C [nvd3dum.dll+0x2fff52] 
# 
Current thread (0x04323400): JavaThread "AWT-Windows" daemon [_thread_in_native, id=5312, stack(0x04d60000,0x04db0000)] 
siginfo: ExceptionCode=0xc0000005, writing address 0x04ee9004 
+0

Wenn es abstürzt, sollten Sie einen Absturzspeicher im Standardarbeitsverzeichnis Ihrer Anwendung erhalten. Weitere Informationen finden Sie unter diesem Link http://stackoverflow.com/questions/1880166/is-it-possible-to-specify-where-jvms-crash-dumps-go Verwenden Sie Java 6 Update 23? –

+1

Haben Sie vielleicht Netzwerklaufwerke auf diesem Computer? Java versucht möglicherweise, von diesen Netzlaufwerken zu lesen, um sie im Dialogfeld aufzulisten. Wenn das Netzwerk aus irgendeinem Grund langsam oder temporär nicht erreichbar ist, könnte dies dazu führen, dass Ihr Programm für eine Weile hängen bleibt. – Jesper

+0

Ich habe viele Netzlaufwerke. Vielleicht hat es damit zu tun. Aber es wird nicht langsamer, stattdessen stürzt es total ab. Entweder es beginnt sofort oder es stürzt für immer ab. Danke trotzdem. Guter Punkt. Ich habe den Desktop als CurrentDirectory (Standardverzeichnis, um den Dialog zu starten) eingestellt und ich denke, es tut es nicht mehr. Also war dein Kommentar nützlich. –

Antwort

2
# Problematic frame: 
# C [nvd3dum.dll+0x2fff52] 

Das wird sein Dein NVidia Videotreiber?

Beachten Sie, dass dies nicht im AWT EDT-Thread ist, sondern ein interner System-Thread. Sie könnten versuchen, Direct Draw 3D zu deaktivieren (dafür gibt es eine Systemeigenschaft).

+0

Ich googelte die spezifische DLL + "Java-Fehler" und sie sagen in den Foren, dass es ein Fehler ist, der in 1.6.0_21 gelöst wird. Ich werde updaten und hoffe, dass es nie wieder auftaucht. –

1

Stellen Sie sicher, dass der Code auf EDT aufgerufen wird.

Auch nur eine Beobachtung (nichts mit dem Absturz zu tun), ist es besser, variable FileChooser zu erklären und sie in derselben Anweisung (Unveränderlichkeit) zuordnen:

final JFileChooser fileChooser = new JFileChooser(); 
+2

+1 zur Überprüfung für [EDT] (http://en.wikipedia.org/wiki/Event_dispatching_thread). –

+1

Dies ist kein Threading-Problem. Wenn Sie von außerhalb des EDT anrufen, wird die JVM nicht abstürzen. Und -1 zum Kommentar "+1 für die Prüfung auf EDT". –

2

Ich habe so etwas unter Windows gesehen, als die JVM sehr nahe daran arbeitete, den vom OS zugewiesenen maximalen Speicher zuzuweisen. Der Benutzer öffnet dann einen Dialog, möglicherweise auf einem Netzlaufwerk, dieser lädt einige zusätzliche Betriebssystemressourcen (möglicherweise DLLs), und dann läuft der JVM nicht genügend Arbeitsspeicher (nicht Heap, sondern der JVM selbst zugewiesener Speicher) und stürzt dann ab.