【问题标题】:How can I instantiate an abstract class to remove a NullPointerException?如何实例化抽象类以删除 NullPointerException?
【发布时间】:2014-04-01 15:28:58
【问题描述】:

所以问题的标题有点奇怪,但这是我能想到的唯一方法。我有一个 NullPointerException 这样做(多余的代码被取出):

public abstract class Generator extends SimpleApplication{

    private static SimpleApplication sa;

    public static void Generator(){
        CubesTestAssets.initializeEnvironment(sa);
    }

我知道private static SimpleApplication sa;null,但是当我实例化它时,我得到了这个错误而不是NullPointerException

SimpleApplication is abstract; cannot be instantiated

我正在使用 jMonkey Engine 3。如果有人知道我如何解决这个问题,那就太好了!谢谢!

【问题讨论】:

  • 正如错误清楚地表明,您不能实例化抽象类。时期。 :)
  • 您需要找到(或编写)SimpleApplication 的具体特化并实例化它
  • 我仍然需要帮助。到目前为止,所有解决方案都没有奏效,@Pradee Simha 对不起,但你错了。我知道可以做到,只是不知道怎么做。
  • @1Poseidon3 回复您的一些 cmets:Generator SimpleApplication。任何需要SimpleApplication 的方法都会对Generator 感到非常满意。 (虽然你当然不能实例化Generator,因为它也是abstract。为什么它是抽象的?)
  • 这很像CarFerry 想要Car 作为输入,但它会很乐意接受HondaAccord

标签: java nullpointerexception abstract-class instantiation jmonkeyengine


【解决方案1】:

如果您仔细查看 JMonkey 文档,SimpleApplication 将由您扩展以创建您的应用程序。

您应该创建一个扩展 SimpleApplication 的新类并实现缺少的方法。然后实例化您的自定义类并将其作为参数传递。

有点像这样:

public class myCustomSimpleApplication extends SimpleApplication {

    // Implementing the missing methods
    @Override
    public void simpleInitApp() {
    }

    @Override
    public void simpleUpdate(float tpf) {
    }

    // etc...

}

然后……

private static SimpleApplication sa = new myCustomSimpleApplication();

public static void Generator(){
    CubesTestAssets.initializeEnvironment(sa);
}

【讨论】:

  • 问题是CubesTestAssets.initializeEnvironment(sa); 必须特别填写SimpleApplication。它不会采取任何其他方式。
  • 阅读polymorphism。一个类的子类可以作为所述类传递。
  • @1Poseidon3 如果它的声明类似于void initializeEnvironment(SimpleApplication x),则该参数可能属于SimpleApplication 的子类的任何 类。
  • 在这里,我进行了编辑,使其更像是一个答案。
【解决方案2】:

正如其他人评论的那样,扩展SimpleApplication 的基本应用程序类(我假设它是Generator)不能是抽象的,即它至少应该实现simpleInitApp 方法。有关SimpleApplication 或此basic example 的信息,请参阅JMonkey 文档。

为了完成,我会提到,如果您确实需要创建抽象类的虚拟实例,您可以“内联”这样做,而无需显式编写完整的实现类。你只需要在构造函数调用之后编写用大括号括起来的抽象方法的实现即可:

public abstract class AbstractClass {

    private static AbstractClass a = new AbstractClass() {
        @Override
        public void abstract_method() {/*implementation*/}
    };

    public abstract void abstract_method();

}

anonymous class 在幕后创建。但我绝对不认为这是你在这种情况下需要的。

【讨论】:

  • 这不是我的基类文件。它包含在我的基类文件中调用的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
相关资源
最近更新 更多