2012-04-14 10 views
0

Ich muss einen neuen Krieger erstellen, einen Namen zuweisen und seine Beschreibung mit der in der GameCahracter-Klasse angegebenen Funktion abrufen. Wenn ich versuche zu rennen - es stoppt auf weapon.type ; // <<Exception zeigt das weapon=null. Warum? Soweit ich weiß, hat der Kriegerkonstrukteur der Variablen weapon einen Link zur neuen Weapon.Sword zugewiesen. Dann mit variabler Waffe sollte ich in der Lage sein, auf sein Feld type zuzugreifen. Was ist hier falsch?Verschachtelte statische Klasse kann ihre statischen Felder nicht zurückgeben


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

EDIT1

Aus irgendeinem Grund habe ich default Zeichenfolge beim Drucken weapon.type. Warum? Wie kann ich type zu Sword bekommen?

+2

Sie wissen, dass 'Character' nicht' Cahracter' geschrieben ist, richtig? –

+0

@Truth: Zumindest ist es konsistent. Das zählt mehr, was den Compiler angeht. – Makoto

+0

Danke, ich weiß wie Charakter geschrieben ist. =) Die Frage ist, warum * Waffe * ist * null *. –

Antwort

2

In diesem Moment verlassen Sie Ihren Konstruktor weapon Feld zu null. Erstellt einfach eine Sword-Instanz, die einmal nicht im Geltungsbereich enthalten ist.

So die Linie

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

in Ihrem Warrior Konstruktor ändern mit

weapon = new Weapon.Sword(); 

oder besser mit

this.weapon = new Weapon.Sword(); 

und Sie tun einen ähnlichen Fehler in Sword Konstruktor, wenn Sie

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

ändern sie mit

this.type = "Sword"; 
this.damage = 10; 
+0

Es hat funktioniert.Aber aus irgendeinem Grund habe ich * default * string beim Drucken von * weapon.type *. Warum? Wie kann ich * typ * string * Sword * bekommen? –

+1

In der Antwort schreibe ich Ihnen, wie Sie dieses Problem auch beheben können: D – dash1e

3

Ihr Problem ist in dieser Zeile:

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

Sie Schatten Ihrer Membervariable mit einem lokalen ein.

Ersetzen Sie es mit:

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

Sie würden an dieser Linie eine Ausnahme, weil die Variable weapon in die Instanz von GameCahracter null ist. Es gibt keinen Code, der das setzt. Der Code im Warrior-Konstruktor legt den Wert einer neuen lokalen Variablen fest, nicht die Elementvariable aus der Klasse.

Verwandte Themen