从抽象类中获取变量

时间:2013-08-25 13:20:46

标签: java minecraft

基本上我想从我的主mod类中的字符串中获取从“World.class”播放的地图的名称...

    public abstract class World implements IBlockAccess{
    protected WorldInfo worldInfo;
    //=====OtherStuff=====
    public World(ISaveHandler par1ISaveHandler, String par2Str, WorldSettings par3WorldSettings, WorldProvider par4WorldProvider, Profiler par5Profiler, ILogAgent par6ILogAgent)
        {
        this.worldInfo.setWorldName(par2Str);
        }
    //=====OtherStuff=====
}

我用同一个

在同一个包中创建了一个类
public class World_Spy extends World{

    public World_Spy(ISaveHandler par1iSaveHandler, String par2Str,
            WorldProvider par3WorldProvider, WorldSettings par4WorldSettings,
            Profiler par5Profiler, ILogAgent par6iLogAgent) {
        super(par1iSaveHandler, par2Str, par3WorldProvider, par4WorldSettings,
                par5Profiler, par6iLogAgent);
    }

    @Override
    protected IChunkProvider createChunkProvider() {
        return null;
    }

    @Override
    public Entity getEntityByID(int i) {
        return null;
    }


    String TheName = "";
    public void gotIt(){
        TheName = this.worldInfo.getWorldName();
        System.out.println(TheName);
    }

}

我从我的主要课程中调用它:

World_Spy WName = new World_Spy(null, null, null, null, null, null);

但它在启动时崩溃了...... 任何想法?

3 个答案:

答案 0 :(得分:1)

World不是静态类...您需要一个World兼容对象的实例来获取名称。获取World的实例然后是名称的一种方法:

World world = Minecraft.getMinecraft().isIntegratedServerRunning() ? mc.getIntegratedServer().worldServerForDimension(Minecraft.getMinecraft().thePlayer.dimension) : Minecraft.getMinecraft().theWorld;
String worldName = world.getWorldInfo().getWorldName();

此代码应该在客户端工作。

答案 1 :(得分:0)

您尚未初始化worldInfo

protected WorldInfo worldInfo; // initialization MISSING!

因此,当您尝试实例化World_Spy时,World()又调用其父类构造函数NullPointerException,您将获得this.worldInfo.setWorldName(par2Str); // NullPointerException here

protected WorldInfo worldInfo = new WorldInfo();

要解决此问题,只需提供实例

即可
{{1}}

答案 2 :(得分:0)

我认为通过抛出NullPointerException来“崩溃”:

this.worldInfo.setWorldName(par2Str);

确实变量worldInfo从未通过尝试调用其方法setWorldName()进行初始化。由于变量为null,此时抛出NullPointerException听起来合理。

在java中(与我所知的所有其他编程语言完全一样),你必须在使用之前初始化变量。实际上,默认情况下使用某种“正常”值初始化原始类型。但是,自定义类型的变量初始化为null,这可能会使初学者感到困惑。

要进行初始化,必须使用构造函数调用后的new关键字:

worldInfo = new WorldInfo();

现在您可以调用worldInfo

的setter和其他方法