2

再現不可能なクラッシュ(エラー/例外なし)。10回のうち1回だけフォルダを選択するダイアログを実行すると発生します。コード:

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 "";
    }
}

アプリケーションがクラッシュします。この後、次のコマンドでのみ閉じることができます:Ctrl + Alt + Delete-> Task Manager-> Kill it->次に、「Java(TM)Platform SEバイナリが応答していません」と表示され、閉じるボタンを押します。

私は何か間違ったことをしていますか、それともバグですか?

Peterが以下に説明するように、クラッシュダンプファイルを見つけました。これがその一部です:

#
# 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
4

3 に答える 3

2

私は、JVMがOSによって割り当てられた最大メモリに非常に近い状態で実行されていたときに、Windowsでこのようなものを見てきました。次に、ユーザーはおそらくネットワークドライブでダイアログを開き、追加のOSリソース(おそらくDLL)をロードします。その後、JVMのメモリ(ヒープではなくJVM自体に割り当てられたメモリ)が不足し、クラッシュします。

于 2010-12-17T17:35:43.853 に答える
2
# Problematic frame:
# C  [nvd3dum.dll+0x2fff52]

それがあなたのNVidiaビデオドライバーになりますか?

これはAWTEDTスレッドではなく、内部システムスレッドであることに注意してください。Direct Draw 3Dを無効にしてみてください(これを行うためのシステムプロパティがいくつかあります)。

于 2010-12-17T17:30:42.190 に答える
1

コードがEDTで呼び出されていることを確認してください。

また、単なる観察(クラッシュとは関係ありません)では、変数fileChooserを宣言し、同じステートメント(不変性)で割り当てることをお勧めします。

final JFileChooser fileChooser = new JFileChooser();
于 2010-12-17T11:36:18.843 に答える