小程序中存在构造函数会引发异常
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