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

Java 当作为可运行jar启动时,应用程序不会在64位窗口上关闭,java,eclipse,64-bit,executable-jar,Java,Eclipse,64 Bit,Executable Jar,我有一个在32位Win(XP和Win7)和eclipse(indigo)下开发/测试的应用程序。我使用File->Export->Runnable Jar(将所需库打包到生成的Jar中)部署应用程序。从那里我把它包装成一个可执行文件 我最近注意到我的应用程序不能在64位Win7(32位Win运行正常)中关闭(无论是“右上角X”还是alt+F4)。我开始在64位Win7中玩arround,发现当从eclipse启动时,我可以关闭应用程序。在我将它导出到一个可运行的罐子中之后,我无法关闭它。我的应用

我有一个在32位Win(XP和Win7)和eclipse(indigo)下开发/测试的应用程序。我使用File->Export->Runnable 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: ressources\settings\startupPlot0.apph (Access denied)
  at java.io.FileOutputStream.open(Native Method)
  ...

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

我可以验证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);

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

您可以从命令行启动jar并使用java-jar程序.jar查看输出吗?是否有可能其他进程锁定了该文件?在Win7中从命令行运行程序与从资源管理器启动程序时,我还看到了奇怪的权限相关问题。我认为Win7默认使用减少的非管理员权限或其他方式运行命令行进程,要解决这个问题,需要在一些高级属性对话框中进行修改。@Alex Nope,我检查过了。我也可以从中读取数据(我在启动时从中加载绘图,这很有效)。我只需对其进行写入(即打开一个
FileOutputStream
)……作为最后手段,您可以尝试右键单击资源管理器中的目录,转到“属性”>“安全”选项卡,并授予每个用户对该目录以及所有子目录的完全控制权。“如果这不能解决你的问题,我就没有主意了。”亚历克斯谢谢你的建议。我试过了,但没用(谢谢,这对我帮助很大。虽然我显然必须对错误/异常/正在发生的任何事情做些什么。)好吧,如果它现在退出,你就不会循环了。因此,只有一行可能导致异常请参见我的编辑。文件访问有点奇怪。但它也适用于其他文件…好主意,问题不在于断开连接(这很好),而是对文件的一些访问权限(请参阅我的编辑)。我想不出任何东西,为什么这不起作用…在文件位置添加一个if语句,该语句读取if(!file.exists())然后读取file.makedirs(),确保目录存在,然后再尝试写入任何内容。我只是这样做了,它告诉我文件存在。我在访问文件时仍然会遇到异常。你能双击该文件在读卡器中打开它吗?如果是这样,你能编辑文件吗?是的,我可以打开它,编辑它,等等。我也可以从应用程序中读取它,我只是不能写入它。很奇怪。。。