带有滴答实体的NullPointerException Minecraft modding 1.8

时间:2016-04-29 01:43:26

标签: java minecraft minecraft-forge

Hello编程员,

我正在为1.8中的Minecraft编写一个mod并且遇到了一个令人讨厌的NullPointerException与我的throwable。在下面的代码中,EntityThrowable使用外部类来获取抛出时将发生的结果,并且BlockPos传递的结果来自getBlockPos()方法。该位置被传递到外部类,在那里它转换为x,y和z坐标。但是,每当我抛出throwable时,它都会抛出这些坐标的异常。

这个问题与什么是NullPointerException的问题之间的区别在于我从mov.getBlockPos()(来自MovingObjectPosition)获得的返回值是未知的。 MovingObjectPosition从随机类中分配BlockPos的坐标,Throwable的编码器获得结果。我正在使用外部类的结果。这些结果导致游戏因未知的坐标而崩溃。如果您对如何获得throwable的最终位置有任何了解,那将不胜感激。

以下是代码:

Throwable的:

@Override
protected void onImpact(MovingObjectPosition mov) {
    LuckyPotionItems lpi = new LuckyPotionItems();
    EntityPlayer player = this.getThrower() instanceof EntityPlayer ? (EntityPlayer) this.getThrower() : null;
    if(!worldObj.isRemote)
    lpi.chooseUnluckyDrink(worldObj, player, mov.getBlockPos());
    this.setDead();
}

外类:

public void chooseUnluckyDrink(World w, EntityPlayer p, BlockPos pos){
    Random r = w.rand;
    int number = r.nextInt(13);
    int x = pos.getX();
    int y = pos.getY();
    int z = pos.getZ();

    System.out.println("Unlucky Number = " + number);

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

听起来问题可以通过检查BlockPosEntityPlayer是否为空来解决。如果它们不为null,则运行该方法。如果它们为null,则只需阻止该方法运行。

@Override
protected void onImpact(MovingObjectPosition mov) {
    LuckyPotionItems lpi = new LuckyPotionItems();
    EntityPlayer player = this.getThrower() instanceof EntityPlayer ? (EntityPlayer) this.getThrower() : null;
    if(mov.getBlockPos() != null && player != null) {
        if(!worldObj.isRemote)
        lpi.chooseUnluckyDrink(worldObj, player, mov.getBlockPos());
        this.setDead();
    }
}

答案 1 :(得分:0)

number = (number == null) ? "" : number; 
System.out.println("Unlucky Number = " + number);

int x = (pos.getX() == null ) ? 0 :  pos.getX();

您将获得该数字的空值,这意味着您需要修复r.nextInt(13);中的输出。我使用条件语句来检查数字的值,如果它为null,那么它将为数字赋值,然后可以打印。尝试我的例子,这会对你有帮助。