当作为可运行的 jar 启动时,应用程序不会在 64 位窗口上关闭



我有一个在32位Win(XPWin7(和eclipse(indigo(下开发/测试的应用程序。我使用文件>导出>可运行 Jar(使用"将所需的库打包到生成的 JAR 中"(部署应用程序。从那里我把它包装成一个可执行文件。

我最近注意到我的应用程序无法在 64 位 Win7(32 位 Win 工作正常(中关闭(既不是"右上角的 X"也不是 alt+F4(。我开始在 64 位 Win7 中玩 arround 并发现,当从 eclipse 启动时,我可以关闭应用程序。我把它导出到一个可运行的罐子里后,我无法关闭它。我的应用程序的所有其他部分都运行良好(也在 64 位 Win7 下(。

我有一个像这样的关机钩子:

// 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()(。问题是当我不在 eclipse 中运行时我没有System.out,所以我看不到是否有任何异常或发生了什么。您知道我如何找到问题(或已经知道问题(吗?

可能的候选人:

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

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

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

java.io.FileNotFoundException: ressourcessettingsstartupPlot0.apph (Access denied)
  at java.io.FileOutputStream.open(Native Method)
  ...

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

我可以验证 system.exit(0( 在 64 位系统上工作。 如果我不得不猜测,我的答案是你没有断开连接,你正在抛出你的中断异常。

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

编辑:尝试

FileOutputStream fos = new FileOutputStream("t.tmp"); // t.tmp is the directory&file name
ObjectOutputStream oos = new ObjectOutputStream(fos);

您可以使用以下命令来确保始终调用 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 循环中无限循环。

最新更新