【问题标题】:Presence of constructor in an applet throws exception小程序中存在构造函数会引发异常
【发布时间】:2011-09-20 14:48:18
【问题描述】:

我正在运行以下 applet。在其中,当我添加构造函数(甚至为空)时,小程序会抛出运行时异常:

MainFrame.class can't be instantiated, java.lang.InstantiationException 

如果我删除构造函数,则不会抛出异常。小程序中不能有构造函数吗?

public class MainFrame extends JApplet implements  WindowListener, ActionListener {
    public void init()
    {       
        System.out.println("Applet Step1");
        String[] args = null;
        createAndShowGUI(args);      
    }
    private static void createAndShowGUI(String[] args) { /*code*/ }
    public MainFrame(final String[] args) {}
}

【问题讨论】:

  • createAndShowGUI(String[]) 不需要声明为static

标签: java constructor applet japplet


【解决方案1】:

你也需要添加一个默认构造函数...

public MainFrame() {}

【讨论】:

  • 因为一旦你向你的类添加了一个构造函数,你就会失去默认的构造函数。默认构造函数由 java 自动创建,除非存在另一个构造函数。
  • 关于构造函数是正确的。但这不是一个很好的解释 为什么 你需要一个默认的构造函数。你能发布你收到的错误吗?
  • 他得到错误的原因是因为浏览器试图通过基本上调用“new MainFrame();”来实例化他的小程序。但是那个构造函数已经不存在了,这就是他得到一个 InstantiationException 的原因。
【解决方案2】:

您需要一个默认构造函数,因为您的类的实例将由浏览器本身实例化(或浏览器将此任务委托给 jre 的 appletviewer 或插件)。

由于浏览器对您的类一无所知,它在所有 Applet 类上工作的唯一方法是使用一组标准参数来实例化它们。而且,对于小程序来说,这组参数很简单:一个空集。

所以,你需要在你的类中有一个默认的(没有参数)构造函数。

在那之后,@Rocky Triton 是对的:在 java 中,如果你没有在类中提供任何构造函数,java 将为它提供一个默认构造函数。但是,一旦您提供了构造函数,无论它是什么,java 都不再提供默认构造函数(正如您所说,在某种程度上,您将负责类的实例化)。

因此,在您的情况下,如果您决定提供带参数的构造函数,java 将不会提供默认构造函数,并且浏览器将无法实例化您的类。

问候, 斯蒂芬

【讨论】:

    【解决方案3】:

    我相信你也应该能够改变: 公共 MainFrame(final String[] args) {}

    到: 公共 MainFrame(String...args) {}

    这允许您不需要传入 args,因此它会构造它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多