Java 尝试设置项目纹理时出现NullPointerException-minecraft 1.8 modding

Java 尝试设置项目纹理时出现NullPointerException-minecraft 1.8 modding,java,nullpointerexception,textures,minecraft,minecraft-forge,Java,Nullpointerexception,Textures,Minecraft,Minecraft Forge,我正在学习如何使用java并尝试构建minecraft mod 问题是我的1.8项目纹理添加系统有问题,即使谷歌是我最好的朋友,我仍然没有找到我应该做什么来修复这个NPE 下面是基本Mod类: package rocha.sekai; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.comm

我正在学习如何使用java并尝试构建minecraft mod

问题是我的1.8项目纹理添加系统有问题,即使谷歌是我最好的朋友,我仍然没有找到我应该做什么来修复这个NPE

下面是基本Mod类:

package rocha.sekai;

import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraft.item.Item;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.relauncher.Side;

@Mod(modid=sekai.MODID, name=sekai.MODNAME, version=sekai.MODVER)
public class sekai{

    //items variable
    public static Item testIngot;


    //Set the ID of the mod (Should be lower case).
    public static final String MODID = "sekairocha";
    //Set the "Name" of the mod.
    public static final String MODNAME = "sekai";
    //Set the version of the mod.
    public static final String MODVER = "0.0.1";

    @Instance(value = sekai.MODID) //Tell Forge what instance to use.
    public static sekai instance;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event){
        testIngot = new testItem();
        if(event.getSide() == Side.CLIENT){
            RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
  line 41-> renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekai:" + ((testItem) testIngot).getName(), "inventory"));
        }

}


    @EventHandler
    public void load(FMLInitializationEvent event)
    {

    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    }
}
public void load(FMLInitializationEvent event){
        if(event.getSide() == Side.CLIENT)
        {
            RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
            renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation(sekai.MODID + ":" + ((testItem) testIngot).getName(), "inventory"));
        }
    }
以下是item类:

package rocha.sekai;

import net.minecraft.item.Item;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class testItem extends Item{

    private final String name = "testIngot";

    public testItem(){
        GameRegistry.registerItem(this, name);
        maxStackSize = 64;
        setCreativeTab(CreativeTabs.tabMisc);
        setUnlocalizedName("testIngot");

    }

    public String getName(){
        return name;
    }
}
下面是错误报告:

java.lang.NullPointerException: Initializing game
    at rocha.sekai.sekai.preInit(sekai.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:536)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
第41行在基本Mod类中标记为代码前面的“line 41->”。我还将在这里进行转录:

renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekai:" + ((testItem) testIngot).getName(), "inventory"));

我认为您的问题在于MODNAME和MODID在
ModelResourceLocation
的实例化方面存在差异。第一个参数要求在“:”之前使用MODID,您使用的是MODNAME。尝试在基本mod类中更改此行:

renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekai:" + ((testItem) testIngot).getName(), "inventory"));
为此:

renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekairocha:" + ((testItem) testIngot).getName(), "inventory"));
或者更好:

renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation(sekai.MODID + ":" + ((testItem) testIngot).getName(), "inventory"));
除此之外,我认为您的item类可能需要一些修改。将构造函数更改为:

public testItem(){
    super(); //missing initializations from Item class
    maxStackSize = 64;
    this.setCreativeTab(CreativeTabs.tabMisc);
    this.setUnlocalizedName("testIngot");
    GameRegistry.registerItem(this, name); //do this last
}

这家伙解释说你必须在init方法中注册项目渲染。我做到了,而且成功了

我所要做的就是将渲染部分移动到init方法。在基本Mod类中,结果是这样的:

package rocha.sekai;

import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraft.item.Item;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.relauncher.Side;

@Mod(modid=sekai.MODID, name=sekai.MODNAME, version=sekai.MODVER)
public class sekai{

    //items variable
    public static Item testIngot;


    //Set the ID of the mod (Should be lower case).
    public static final String MODID = "sekairocha";
    //Set the "Name" of the mod.
    public static final String MODNAME = "sekai";
    //Set the version of the mod.
    public static final String MODVER = "0.0.1";

    @Instance(value = sekai.MODID) //Tell Forge what instance to use.
    public static sekai instance;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event){
        testIngot = new testItem();
        if(event.getSide() == Side.CLIENT){
            RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
  line 41-> renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation("sekai:" + ((testItem) testIngot).getName(), "inventory"));
        }

}


    @EventHandler
    public void load(FMLInitializationEvent event)
    {

    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    }
}
public void load(FMLInitializationEvent event){
        if(event.getSide() == Side.CLIENT)
        {
            RenderItem renderItem = Minecraft.getMinecraft().getRenderItem();
            renderItem.getItemModelMesher().register(testIngot, 0, new ModelResourceLocation(sekai.MODID + ":" + ((testItem) testIngot).getName(), "inventory"));
        }
    }

无论如何,谢谢你们。

去minecraft modding论坛,你们可能会得到更好的帮助。在
sekai
中,哪一行是第41行?从堆栈跟踪中,它看起来像sekai.java第41行的空指针异常。从包含的代码片段中很难看出第41行是什么。但是,您可以首先检查所使用的任何对象是否已实例化。例如,参数“event”是否为null?或者,“renderItem”是否为null?@danplubell标记了第41行,很抱歉忘记这么做。这一行是否返回null:Minecraft.getMinecraft().getRenderItem()?如果没有,那么这一行是否返回null:renderItem.getItemModelMesher()可能是Thank的副本,但我按照您所说的更改了它,仍然得到相同的NPE。还有其他想法吗?@secknv已编辑以添加其他修复程序