0

新しい戦士を作成し、名前を割り当て、GameCahracterクラスで指定された関数を使用して彼の説明を取得する必要があります。私が走ろうとしているとき-それはそれをweapon.type ; // <<Exception 示すことで止まりweapon=nullます。なんで?私の知る限り、weapon新しいWeapon.Swordへのリンクを変数に割り当てられた戦士コンストラクター。次に、可変武器を使用して、そのフィールドにアクセスできるはずtypeです。ここで何が問題になっていますか?


abstract class GameCahracter{
    public String name;
    public String type;
    public Weapon weapon; 
    public int hitPoints;

    public String getDescription(){
        return  name + "; " + 
        type + "; "  + 
        hitPoints + " hp; " + 

        weapon.type ; // << Exception
    }

    public static class Warrior extends Player{
        public Warrior() {
            type = "Warrior";
            hitPoints = 100;
            Weapon.Sword weapon = new Weapon.Sword(); 
    }
}

abstract class Player extends GameCahracter {

}

 abstract class Weapon {
    public int damage;
    public String type = "default";

    public int getDamage(){
        return this.damage;
    }

    public static class Sword extends Weapon{

        public Sword() {

            String type = "Sword";
            int damage = 10; 
        }

    }
}

GameCahracter.Warrior wr = new GameCahracter.Warrior();     
wr.setName("Joe");
System.out.println( wr.getDescription());

編集1

どういうわけかdefault、印刷時に文字列が表示されweapon.typeます。なんで?どうすればtypeなりSwordますか?

4

3 に答える 3

3

あなたの問題はこの行にあります:

Weapon.Sword weapon = new Weapon.Sword(); 

メンバー変数をローカル変数でシャドウします。

に置き換えます:

this.weapon = new Weapon.Sword(); 
于 2012-04-14T16:23:16.163 に答える
2

この瞬間、コンストラクターはweaponフィールドをに残しますnullSwordスコープ外になるとガベージされるインスタンスを作成するだけです。

だから行を変更します

Weapon.Sword weapon = new Weapon.Sword(); 

Warriorコンストラクターで

weapon = new Weapon.Sword(); 

以上で

this.weapon = new Weapon.Sword(); 

Swordそして、あなたが書くとき、あなたはコンストラクターで同様のエラーをします

String type = "Sword";
int damage = 10; 

でそれらを変更します

this.type = "Sword";
this.damage = 10; 
于 2012-04-14T16:22:06.153 に答える
1

weaponのインスタンスの変数GameCahracterがnullであるため、その行で例外が発生します。それを設定するコードはどこにもありません。コンストラクターのコードはWarrior、クラスのメンバー変数ではなく、新しいローカル変数の値を設定します。

于 2012-04-14T16:24:08.680 に答える