小程序中存在构造函数会引发异常

Posted

技术标签:

【中文标题】小程序中存在构造函数会引发异常【英文标题】: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 【参考方案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,因此它会构造它。

【讨论】:

以上是关于小程序中存在构造函数会引发异常的主要内容,如果未能解决你的问题,请参考以下文章

wpf对类型“xxx.MainWindow”的构造函数执行符合指定的绑定约束的调用时引发了异常

Spring-boot,无法自动装配类。未找到默认构造函数引发异常

此类未定义公共默认构造函数,或构造函数引发异常。内部异常:java.lang.InstantiationException

“在匹配指定绑定约束的类型'TestWPF.MainWindow'上调用构造函数引发异常。” - 如何解决这个问题?

为啥受保护的构造函数会在此代码中引发错误?

C++的构造函数可以抛出异常么