【问题标题】:class can't be instantiated类不能被实例化
【发布时间】:2012-01-24 22:20:13
【问题描述】:

我对 java 小程序和图形有疑问。我试图在 Eclipse 中运行它,但它失败了。 我是java新手,希望你能帮助我。 我有两个文件:Say.java 和 SayWhat.java。 Say.java:

public class Say {
    SayWhat word = new SayWhat("Hello World");

}

SayWhat.java:

import java.applet.Applet;
import java.awt.Graphics;

@SuppressWarnings("serial")
public class SayWhat extends Applet {
     Graphics g;
     String what;
    public SayWhat(String what) {
        this.what=what;
    }
    public void paint(Graphics g){
        g.drawString(what, 20, 20);
    }
}

出现的错误是:

load: SayWhat.class can't be instantiated.
java.lang.InstantiationException: SayWhat
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at sun.applet.AppletPanel.createApplet(Unknown Source)
    at sun.applet.AppletPanel.runLoader(Unknown Source)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

你能告诉我我做错了什么吗?

【问题讨论】:

  • 这是this question的副本
  • 1) 我在使用 java 小程序和图形时遇到问题"* 有经验的开发人员在使用小程序时会遇到问题,但是.. "我是 java 新手" ..这是一个秘诀灾难。为什么要编写小程序而不是框架?2) 为什么使用 Applet 而不是 JApplet?AWT 组件 (Applet) 几乎已过时。

标签: java graphics applet


【解决方案1】:

applet 需要有一个公共的无参数构造函数(通过有一个显式的公共无参数构造函数,或者根本没有显式的构造函数;在后一种情况下,编译器将提供一个公共的无参数构造函数默认)。你的类的唯一构造函数接受一个参数:

public SayWhat(String what) {

所以没有那个参数就不能实例化类,所以它不能用作小程序。

【讨论】:

  • 在这种情况下如何将我的字符串的值传递给 aplet?据我了解,在我创建的每个对象上 - 小程序被调用时没有字符串值。
  • @user1168085:您可以将其作为“输入参数”传递;见docs.oracle.com/javase/tutorial/deployment/applet/param.html
  • 嗯,有没有其他解决方案?也许更容易。
  • @user1168085:这个解决方案乍一看可能看起来很复杂,但是如果您通读该页面,您会发现它实际上非常简单。该页面提到了很多你可以做的事情,但实际上需要的却很少。哦,顺便说一下,有关从 Eclipse 传递参数的说明,请参阅 people.cs.uchicago.edu/~amr/121/labs/eclipsetute/applet.html
【解决方案2】:

SayWhat 类应该有一个不带参数的公共构造函数。

【讨论】:

    【解决方案3】:

    查看java.lang.InstantiationException的文档

    有两种可能的原因:

    1)代码和对象属性都在标签中指定:

    <APPLET code=MyApplet object=MyApplet.ser width=100 height=100>
    </APPLET>
    

    Sun JRE 可以访问代码或对象属性,但不能同时访问两者。

    2)在标签中指定了代码属性,在标签中指定了对象属性:

    <APPLET code=MyApplet width=100 height=100>
    <PARAM name="object" value="someValue">
    </APPLET>
    
    public class MyApplet extends java.applet.Applet
    {
            public void init()
            {
                   String value = getParameter("object");
            }
            ....
    }
    

    编辑:添加default constructor,如下:

    public SayWhat() {}
    

    【讨论】:

    • 感谢您的良好回复,已为您添加 +1。但是你能解释一下吗,如果我的构造函数没有捕获任何参数,我怎么能将我的字符串传递给小程序?
    • 你需要有两个构造函数。
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2016-09-21
    • 2014-04-03
    • 2021-05-11
    • 2015-02-01
    • 2023-03-04
    相关资源
    最近更新 更多