Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 小程序有时会自动关闭_Java_Nullpointerexception_Java 7 - Fatal编程技术网

Java 小程序有时会自动关闭

Java 小程序有时会自动关闭,java,nullpointerexception,java-7,Java,Nullpointerexception,Java 7,我的java应用程序发生了非常奇怪的事情。总而言之,问题在于,它有时会在工作30-60秒后自动关闭 具体情况如下: System.setSecurityManager(new SecurityManager() { @Override public void checkPermission(Permission p) {} }); URLClassLoader loader = new URLClassLoader(new URL[] {mainJarFile.toURI().toURL(

我的java应用程序发生了非常奇怪的事情。总而言之,问题在于,它有时会在工作30-60秒后自动关闭

具体情况如下:

System.setSecurityManager(new SecurityManager() {
   @Override public void checkPermission(Permission p) {}
});
URLClassLoader loader = new URLClassLoader(new URL[] {mainJarFile.toURI().toURL()}, this.getClass().getClassLoader());
Class<?> app = Class.forName("launch.App", true, loader);
Method start = app.getDeclaredMethod("start", URL.class, URL.class);
start.invoke(app.newInstance(), codeBase, documentBase);
  • 应用程序实际上是在applet设置中启动的,applet加载主应用程序jar,将其保存到磁盘,然后通过反射启动实际程序。小程序jar已签名,应用程序jar未签名,因此我必须重写安全管理器。代码如下:

    System.setSecurityManager(new SecurityManager() {
       @Override public void checkPermission(Permission p) {}
    });
    URLClassLoader loader = new URLClassLoader(new URL[] {mainJarFile.toURI().toURL()}, this.getClass().getClassLoader());
    Class<?> app = Class.forName("launch.App", true, loader);
    Method start = app.getDeclaredMethod("start", URL.class, URL.class);
    start.invoke(app.newInstance(), codeBase, documentBase);
    
  • 在关闭钩子启动后,应用程序似乎仍在运行,我在日志中看到了如下异常:

    2012.11.13 16:20:07.171 | def.pR.run:1639 | class java.lang.NullPointerException : null
        sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
        java.security.AccessController.doPrivileged(Native Method)
        sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
        sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)        
        ... // so on, the exception seems to happen in completely regular app code
    
  • 最后,直到那些Citrix服务器开始使用
    Java7
    (特别是Java7更新9)而不是
    Java6
    ,才出现这样的问题。降级java似乎不是一种选择


我在这里完全迷路了。至少有人能给我一些解决这个问题的建议吗?原因可能是什么?有办法解决这些问题吗?

重写安全管理器:这难道不意味着您实际上避开了整个Java小程序安全概念吗?发布一个禁用安全管理器的小程序,然后加载另一个应用程序,对我来说,这听起来是一个非常糟糕的主意,尤其是如果你没有Java小程序那么多的安全检查的话。如果有人设法抓取这个小程序,他们可能会使用它从自己的网站加载攻击代码,您可能会被吊销证书

在Java 7u7前后,一个主要的安全问题得到了解决:

但它在7u7中尚未完全修复:

事实上,还有一个问题尚未解决:


可能其中一个更改会影响security manager的单步执行?

首先,我希望您在运行下载的应用程序之前正确验证它(通过SSL下载或使用数字签名验证它,在这种情况下,您最好对jar进行签名)

解决这个问题。这很容易,因为您正在applet JVM中运行。小程序jvm的生命周期由浏览器决定。因此,如果您仍然希望使用小程序作为启动器,请在小程序子类的
applet.destroy()
applet.stop()
方法中插入一些调试输出,并查看这是否与关闭相关


另一个解决方案是使用JavaWebStart启动它。这确实是从web启动java应用程序的最佳方式。

“原因可能是什么?”这可能是JRE中的一个错误。请检查,如果您没有找到任何相关内容,请提出一个。@AndrewThompson-我应该在该数据库中查找哪些关键字?JRE版本号可能是一个赠品。我还加入了
NullPointerException
。我通过JavaWebStart启动了它。即使一开始它失败了,我也可以用很多jvm选项和东西来装备它,最后接近这个问题。此外,JWS总体上提供了更多的灵活性。