5

JFileChooser を作成する Swing GUI の単体テストを作成しました。単体テストはビルド サーバーでサービスとして実行されるため、単体テストはローカル システム アカウントとして実行する必要があります。ただし、単体テストで新しい JFileChooser を作成しようとすると、NullPointerException がスローされます。

私は問題をローカル システム アカウントとして次のメイン クラスを実行する問題に減らしました (実際のコードではありません)。

package com.example.mcgr;

import javax.swing.*;
import java.io.IOException;

public class FileChooserAsSystem {

    public static void main(String[] args) throws IOException {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.showDialog(null, "Ok");
            }
        });
    }
}

次のビルド ファイルを使用します。

<project>

<target name="clean">
    <delete dir="build"/>
</target>

<target name="compile" depends="clean">
    <mkdir dir="build/classes"/>
    <javac srcdir="src" destdir="build/classes"/>
</target>

<target name="jar" depends="compile">
    <mkdir dir="build/jar"/>
    <jar destfile="build/jar/FileChooserAsSystem.jar" basedir="build/classes">
        <manifest>
            <attribute name="Main-Class" value="com.example.mcgr.FileChooserAsSystem"/>
        </manifest>
    </jar>
</target>

<target name="run">
    <java jar="build/jar/FileChooserAsSystem.jar" fork="true"/>
</target>

</project>

自分のユーザー アカウントとしてコードを実行すると、JFileChooser が表示されます (上記のコードを削除すると、その後何も実行されないため、実行したいのはこれだけです)。

上記のコードをシステム アカウントとして実行すると (たとえば、PsTools/PsExec をインストールし、 PsExec.exe -s -i cmd.exeシステム アカウントとして cmd を起動してから jar を実行すると、次のスタック トレースが得られます。

 [java] Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 [java]     at sun.awt.shell.Win32ShellFolder2.access$200(Win32ShellFolder2.java:72)
 [java]     at sun.awt.shell.Win32ShellFolder2$1.call(Win32ShellFolder2.java:242)
 [java]     at sun.awt.shell.Win32ShellFolder2$1.call(Win32ShellFolder2.java:237)
 [java]     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
 [java]     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
 [java]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 [java]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 [java]     at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Win32ShellFolderManager2.java:502)
 [java]     at java.lang.Thread.run(Thread.java:724)

ローカル システム アカウントによって起動された JVM 内で JFileChooser オブジェクトを作成するにはどうすればよいですか?

現在、JVM バージョン 1.7.0_25 32 ビットを使用しており、Windows Server 2008 と Windows 7 の両方でテストしました。32 ビット JVM から 64 ビット JVM に切り替えることができないという別の要件があります。

Google からのさまざまな提案を試しました。

  • -Dswing.disableFileChooserSpeedFix=true を渡す
  • -Duser.home=./ を渡す
  • -Dtemp.dir=C:/temp を渡す

...しかし、誰も結果を変えませんでした。

助けてくれてありがとう。

4

3 に答える 3

2

これは JVM の問題ではなく、パーミッションの問題です。最近、Windows 10 マシンで Java 8v92 を実行している同様のスタック トレースに遭遇しました。

これを修正するには、管理者アカウントとしてログオンするように Windows サービスを設定します (サービスを起動し、サービスを強調表示してプロパティを表示し、Windows 10 の [ログオン] タブを選択します)。

管理者アカウントを使用するように Windows サービスを設定する

于 2016-08-18T14:27:56.290 に答える
0

Java 7の問題だと思います。バージョンを確認し、別のバージョンで試してください。または、Java のバージョンをアップグレードしてください。

于 2014-06-10T16:42:17.500 に答える