【问题标题】:java applet ExceptionInInitializerErrorjava小程序ExceptionInInitializerError
【发布时间】:2015-04-13 11:06:11
【问题描述】:

我是 Applet 编程的新手,我想制作一个 Applet 以放在网站上。 所以我们开始吧。

这个项目的目标是,如果您单击该按钮,它将在浏览器顶部打开一个 JFrame。但在测试时,它给了我一个java.lang.ExceptionInInitializerError。 这是源代码:

public class LaunchMenu extends Applet {

    public static LoginScreen login;
    public static Game game;
    public JButton button;
    public void init() {
        try {button= new JButton("Press this button to start");
        add(button);

        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                login = new LoginScreen();

            }
        });
        } catch (Exception e) {
            e.getMessage();
            e.getCause();
        }
    }

    public void start() {
        login = new LoginScreen();
    }

    public void stop() {
        login.dispose();
        game.stop();
    }

    public static void main(String[] args) {

    }

}

注意:它可以在带有 Applet 窗口的 Eclipse 中使用,但不能在网站上使用。

编辑:

Exception in thread "AWT-EventQueue-2" java.lang.IllegalStateException: Applet's parent container not set up
    at sun.plugin2.applet.Plugin2Manager.start(Unknown Source)
    at sun.plugin2.main.client.PluginMain$StartAppletRunner.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
CacheEntry[http://localhost/AppletTest/Applet.jar]: updateAvailable=true,lastModified=Mon Apr 13 12:24:52 CEST 2015,length=5051938

【问题讨论】:

  • 堆栈跟踪会有用吗?
  • 1) 为什么要编写小程序?如果是老师指定的,请参考Why CS teachers should stop teaching Java applets。 2) 为什么使用 AWT?请参阅 this answer 了解放弃 AWT 使用支持 Swing 的组件的许多充分理由。
  • @AndrewThompson 回答您的第一个问题;我使用小程序的原因是因为我正在和某人一起做一个项目。他正在制作网站,而我正在制作与 Java 相关的东西。为了把它放在网上,我正在使用小程序。 (我唯一知道的是将它放在网络上):) 对于您的第二个问题:不要误会我的意思,我将 swing 与 AWT 结合使用。 Swing 用于所有视觉部分,而 Awt 用于 ActionListeners 和 ItemsListeners ;) 因为它是“不可能不这样做的。”
  • "(我唯一知道的将它放到网络上)" 从使用Java Web Start 的链接启动JFrame(它更简单)。 ".. 我将 swing 与 AWT 结合使用。Swing 用于所有视觉部分.." 在这种情况下,public class LaunchMenu extends Applet { 应该是 public class LaunchMenu extends JApplet {(注意 J 中的那里)。

标签: java swing security exception applet


【解决方案1】:

好的,我解决了我的问题。这是对我有用的解决方案。

源代码保持不变(除了微小的变化)*:

public class LaunchMenu extends Applet {

    public static LoginScreen login;
    public static Game game;
    public JButton button;
    public void init() {
        try {button= new JButton("Start the game");
        add(button);

        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                login = new LoginScreen();
                login.setVisible(true); *

            }
        });
        } catch (Exception e) {
            e.getMessage();
            e.getCause();
        }
    }

    public void start() {
        login = new LoginScreen();
    }

    public void stop() {
        login.dispose();
        game.stop();
    }

    public static void main(String[] args) {

    }
}

但我在与 Applet 相同的文件夹中添加了一个 java.policy 文件。 在这个文件中,我编写了以下代码:

grant { 
      permission java.security.AllPermission; 
}; 

设置完成后,我遇到了另一个名为java.lang.RuntimePermission: "exitVM.0"的问题

这个问题的解决方法很简单。在我的 JFrame 类中,在我的情况下为LoginScreen,有一个行代码setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);。删除或评论它,这对我有用,现在我的小程序可见并且登录框架打开。这就是我所需要的。

希望这可以帮助很多有同样问题的人。

【讨论】:

  • "但是我添加了一个java.policy 文件.." 小程序需要经过数字签名才能在网络上启动(或使用 Java Web Start )。现在可能最好弄清楚这一点并将其添加到项目的构建中。
  • "..有一个行代码setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);。删除或评论它.." 最好改为setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);。这样,当小程序虚拟机结束时,它可以正常关闭。 (默认DO_NOTIHNG_ON_CLOSE,它隐藏了框架但把它留在内存中,滴答作响..)
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多