【问题标题】:Passing object as parameter将对象作为参数传递
【发布时间】:2012-04-20 13:16:34
【问题描述】:

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

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());
}

但是,即使实例是武器,我也需要执行 raisePlayerKills()。我似乎找不到解决方案。

更多信息:

Playertank.java creates the gameplayer and extends GamePlayer.java
GamePlayer.java extends MoveableGameItem.java
Enemytank.java extends MoveableGameItem.java
MoveableGameItem.java extends GameItem.java

我希望它足以解决这个问题, 提前谢谢火焰

【问题讨论】:

  • 该方法不返回任何内容。你的意思是你得到一个 NullPointerException 吗?
  • 2.0/3.0 * startupEnemyHealth 不是乘以分数的好方法。 2 * startupEnemyHealth / 3.0 将为 startupEnemyHealth 300 返回 200,而您的版本将返回一个近似值。
  • 为什么是这样?我会说 2*5/3 与 2/3*5 相同 :) 当然我不是 java 编译器

标签: java object parameters extends


【解决方案1】:

这个演员没有做任何事情:checkEnemyHealth((GameItem)collidedItem); -- collidedItem 已经是 GameItem 类型。

这种向下转换肯定会失败:checkEnemyHealth((Playertank)collidedItem); 因为我假设Playertank 不是Weapon 的子类,反之亦然。

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

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

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

【讨论】:

  • 它返回java.lang.ClassCastException,抱歉我没有说它返回一个空指针,只是一个空:)
  • 每当您的代码抛出异常时,请务必在发布问题时提供堆栈跟踪。它始终是关键的诊断信息。
  • 那么,你明白我说的话了吗?你不能只是继续沮丧到Playertank。如果不是Playertank怎么办?
  • 我得到它我得到它,似乎我的方法永远不会奏效,因为我'必须'得到 ((Playertank)collidedItem).raisePlayerKills(1);工作,即使碰撞的物品是武器。在这种情况下,参数是一个 Weapon 对象(如果我放 checkEnemyHealth((Weapon)collidedItem);)
  • 所以我需要一个随时检索 Playertank 对象的方法。我尝试在 collisionOccured() 中包含 checkEnemyHealth() 但这变得一团糟,它会一遍又一遍地检查嗯...
【解决方案2】:

首先,我建议在调试器中遍历代码。这很可能会告诉你什么是空的。似乎碰撞的项目为空。您确定要将实例化对象传递给方法 checkEnemyHealth 吗?

【讨论】:

  • (Playertank)collidedItem) 似乎为空,据我所知,Playertank 总是被实例化嗯......
猜你喜欢
  • 1970-01-01
  • 2016-08-28
  • 2012-07-13
  • 2023-04-02
  • 1970-01-01
  • 2021-07-29
  • 2017-03-04
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多