4

我有一个我在32 位 WinXPWin7)和 Eclipse(靛蓝)下开发/测试的应用程序。我使用 File->Export->Runnable Jar 部署应用程序(使用“将所需的库打包到生成的 JAR”中)。从那里我将它包装成一个可执行文件。

我最近注意到我的应用程序无法在64 位 Win732 位 Win工作正常)中关闭(无论是“右上角 X”还是alt+ )。我开始在64位Win7下玩arround ,发现从eclipse启动时,我可以关闭应用程序。将其导出到可运行的 jar 后,我无法关闭它。我的应用程序的所有其他部分都可以正常工作(也在64 位 Win7下)。F4

我有一个像这样运行的关闭挂钩:

// initialize JFrame frame;
frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
        closeApplication();
    }
});
frame.setVisible(true);

public void closeApplication() {
    while (ConnectionManager.isConnected())
        try {
            ThreadManager.addMeasRequestPriority(eMeasRequest.DISCONNECT);
            Thread.sleep(100);
        } catch (InterruptedException e) {}
    ConfigurationManager.saveToXML(new File("ressources/settings/startup.xml"));
    System.exit(0);
}

我注意到 GUI 正在断开连接,但仅此而已(但这意味着closeApplication()已输入)。问题是System.out当我不在eclipse中运行它时我没有,所以我看不到是否有任何异常或发生了什么。您知道我如何找到问题(或已经知道问题)吗?

可能的候选人:

  • System.exit(0) 在64 位 下有不同的行为(为什么会这样,是否有替代方案?)
  • 我无法创建/写入给定文件startup.xml (如何检查?)
  • 我的64 位 Win7笔记本电脑中的一个小矮人用他的铁锤短路了主板上的一些东西,从而阻止了应用程序关闭(我怎样才能删除他?)
  • 其他

如果您能告诉我这里发生了什么或您将如何继续了解更多信息,我将不胜感激。

编辑:感谢您的快速回复。我发现,我得到以下异常:

java.io.FileNotFoundException: ressources\settings\startupPlot0.apph (Access denied)
  at java.io.FileOutputStream.open(Native Method)
  ...

但这怎么可能呢?该文件肯定存在并以非 64 位 Win写入。此外,在该文件发生异常之前,同一目录中还有其他文件被写入。他们工作(我刚刚检查过他们)。唯一的区别:对于其他文件,我对其他文件使用 a new OutputStreamWriter(new FileOutputStream(File file)),对这个文件使用 a new DataOutputStream(new FileOutputStream(File file))

4

2 回答 2

3

我可以验证 system.exit(0) 是否适用于 64 位系统。如果我不得不猜测,我的答案是您没有断开连接并且您正在抛出您的中断异常。

我的建议:在你的 catch 语句中放置一个 system.out.print 语句,看看你是否正在捕捉。如果是,你知道你有问题,如果不是,你没有断开连接并坐在 while 循环中。

编辑:试试

FileOutputStream fos = new FileOutputStream("t.tmp"); // t.tmp is the directory&file name
ObjectOutputStream oos = new ObjectOutputStream(fos);
于 2012-07-13T13:27:14.573 回答
2

您可以使用以下内容确保始终调用 System.exit(0) ,而不管任何异常:

public void closeApplication(){
        try{
            while (ConnectionManager.isConnected()){
                try{
                    ThreadManager.addMeasRequestPriority(eMeasRequest.DISCONNECT);
                    Thread.sleep(100);
                }
                catch (InterruptedException e){
                }
            }
            ConfigurationManager.saveToXML(new File("ressources/settings/startup.xml"));
        }
        finally{
            System.exit(0);
        }
    }

不过,您也可能在 while 循环中无限循环。

于 2012-07-13T13:33:16.723 回答