Java 作为参数传递对象

Java 作为参数传递对象,java,object,parameters,extends,Java,Object,Parameters,Extends,我似乎无法做到以下几点:我得到了这个方法checkEnemyHealth(),它通过更改精灵和添加杀戮等来照顾敌人的健康。但是,我需要更改特定玩家银行对象的杀戮,所以我尝试了以下代码: public void collisionOccured(GameItem collidedItem) { if(collidedItem instanceof Playertank) //Botsing met player { enemyHealth = 0.0;

我似乎无法做到以下几点:我得到了这个方法checkEnemyHealth(),它通过更改精灵和添加杀戮等来照顾敌人的健康。但是,我需要更改特定玩家银行对象的杀戮,所以我尝试了以下代码:

public void collisionOccured(GameItem collidedItem)
{
    if(collidedItem instanceof Playertank) //Botsing met player
    {
        enemyHealth = 0.0;      
    }       
    if (collidedItem instanceof Weapon) //Botsing met wapen
    {
        lowerEnemyHealth(Weapon.weaponDamage);
        System.out.println("loweredddd");
    }
    if ((collidedItem instanceof Weapon) || (collidedItem instanceof Playertank))
    {
    checkEnemyHealth((GameItem)collidedItem);
    }
}

    public void checkEnemyHealth(GameItem collidedItem)
{
    if (enemyHealth >= (2.0/3.0 * startupEnemyHealth))
    {
        this.setFrame(0); //Green Enemy
        this.setEnemyStage(0);
    }
    else if (enemyHealth < (2.0/3.0 * startupEnemyHealth) && enemyHealth >= (1.0/3.0 * startupEnemyHealth))
    {
        this.setFrame(1); //Orange Enemy
        this.setEnemyStage(1);
    }
    else if (enemyHealth < (1.0/3.0 * startupEnemyHealth) && enemyHealth > 0)
    {
        this.setFrame(2); //Red Enemy
        this.setEnemyStage(2);
    }
    else if (enemyHealth <= 0 && (getEnemyStage() != 3))
    {
        setImage("/images/death.png", 27, 33); //Dead enemy     
        enemyOnDeath();
        if (collidedItem instanceof Playertank)
        {
            ((Playertank)collidedItem).raisePlayerKills(1); 
            mygame.setKillsonDashboard(((Playertank)collidedItem).getPlayerKills());
            ((Playertank)collidedItem).raisePlayerLandmines(1);
            mygame.setLandminesonDashboard(((Playertank)collidedItem).getPlayerLandmines());
        }
        mygame.setTimer(10, 33, this);
    }
    printHealth();
    System.out.println(this.getEnemyStage());
}
我希望这足以解决这个问题,
首先,我建议在调试器中遍历代码。这很可能会向您显示什么是空的。冲突项似乎为空。是否确实要将实例化对象传递给方法checkEnemyHealth?

此强制转换不起任何作用:
checkEnemyHealth((GameItem)collidatem);
--CollidateTM已经是
GameItem
类型

这一降级肯定会失败:
checkEnemyHealth((Playertank)collidatem)因为我假设
Playertank
不是
武器的子类,反之亦然

总的来说,您发布的确切代码不能引发
NullPointerException
,因为没有代码路径可以调用
checkEnemyHealth
,而
null
——这是在“beforreee”之后获得NPE的唯一方法,而不是在“afterrrr”之后。所以让我问你:你的代码抛出了什么异常?我怀疑有
ClassCastException

((Playertank)collidedItem).raisePlayerKills(1);

这是对Playertank的未经检查的dowcast。

该方法不返回任何内容。你是说你得到了一个NullPointerException吗?
2.0/3.0*StartupEneyHealth
不是一个用分数乘法的好方法<代码>2*startupEnemyHealth/3.0
将为startupEnemyHealth 300返回200,而您的版本将返回近似值。顺便说一句,这是为什么?我想说2*5/3和2/3*5是一样的:)当然我不是java编译器(Playertank)Collidatem)看起来是空的,据我所知Playertank总是实例化的,嗯……它返回java.lang.ClassCastException,很抱歉我没有说它返回空指针,只是空:)每当你的代码抛出异常,发布问题时始终提供stacktrace。它总是关键的诊断信息。那么,你明白我说的吗?你不能就这样继续下去,然后向Playertank低头。如果它不是一个
Playertank
?我明白了,我明白了,我的方法似乎永远不会起作用,因为我“必须”得到((Playertank)collidatem);即使碰撞的物品是武器,也能起作用。在这种情况下,参数是一个武器对象(如果我将checkEnemyHealth((武器)collidatem);),因此我需要获取一个方法,该方法可以随时检索Playertank对象。我尝试将checkEnemyHealth()包含在冲突发生()中,但结果变得一团糟,它会一次又一次地检查,嗯。。。
((Playertank)collidedItem).raisePlayerKills(1);