2017-07-22 4 views
0

Ich habe ein Problem beim Erstellen einer Instanz der Kanji-Klasse. Es sollte 2 statische innere Klassen haben. Jede der inneren Klassen sollte zwei Strings enthalten.Java statische innere Klassen, die null zurückgeben

Wenn ich die Klasse instanziiere, gibt sie die zwei statischen inneren Klassen als Nullen zurück.

Volle Klasse ist unten. Ist mein Konstruktor korrekt? Wenn ich die inneren Klassen und ihre Strings nicht als statisch habe, bekomme ich einen Fehler.

Kanji kanji = new Kanji("aaa","bbb","ccc","ddd","eee","fff"); 

Meine Klasse

public class Kanji { 

public String character; 
public String meaning; 
public Onyomi onyomi; 
public Kunyomi kunyomi; 

public static class Onyomi { 
    public static String romaji; 
    public static String katakana; 
    public String getRomaji() { 
     return romaji; 
    } 

    public void setRomaji(String romaji) { 
     this.romaji = romaji; 
    } 

    public String getKatakana() { 
     return katakana; 
    } 

    public void setKatakana(String katakana) { 
     this.katakana = katakana; 
    } 

} 
public static class Kunyomi { 
    public static String romaji; 
    public static String hiragana; 

    public String getRomaji() { 
     return romaji; 
    } 

    public void setRomaji(String romaji) { 
     this.romaji = romaji; 
    } 

    public String getHiragana() { 
     return hiragana; 
    } 

    public void setHiragana(String hiragana) { 
     this.hiragana = hiragana; 
    } 
} 

public Kanji(String character_, String meaning_, String oR_, String oK_, String kR_, String kH_) { 
    this.character = character_; 
    this.meaning = meaning_; 
    this.onyomi.romaji = oR_; 
    this.onyomi.katakana = oK_; 
    this.kunyomi.romaji = kR_; 
    this.kunyomi.hiragana = kH_; 
} 

public String getCharacter() { 
    return character; 
} 

public void setCharacter(String character) { 
    this.character = character; 
} 

public String getMeaning() { 
    return meaning; 
} 

public void setMeaning(String meaning) { 
    this.meaning = meaning; 
} 

public Onyomi getOnyomi() { 
    return onyomi; 
} 

public void setOnyomi(Onyomi onyomi) { 
    this.onyomi = onyomi; 
} 

public Kunyomi getKunyomi() { 
    return kunyomi; 
} 

public void setKunyomi(Kunyomi kunyomi) { 
    this.kunyomi = kunyomi; 
} 
} 

Antwort

1

Ich denke, es gibt 2 Probleme in diesem Code.

Die erste (wodurch die Tatsache, dass die onyomi und kunyomi Felder Null sind) ist, dass in Ihrem Konstruktor Code, müssen Sie diese Variablen nicht initialisiert werden, so dass keine, ist der Konstruktor

falsche

Was Sie brauchen im Konstruktor ist diese 2 Zeilen hinzufügen: wie diese

this.onyomi = new Onyomi(); 
this.kunyomi = new Kunyomi(); 

bevor Sie onyomi und kunyomi Feldern:

public Kanji(String character_, String meaning_, String oR_, String oK_, String kR_, String kH_) { 
    this.character = character_; 
    this.meaning = meaning_; 
    this.onyomi = new Onyomi(); 
    this.kunyomi = new Kunyomi(); 
    this.onyomi.romaji = oR_; 
    this.onyomi.katakana = oK_; 
    this.kunyomi.romaji = kR_; 
    this.kunyomi.hiragana = kH_; 
} 

Das zweite Problem scheint mit diesem Testcode:

Kanji ima = new Kanji("今","now","ima_on","イマ","ima_kun","いま"); 
    System.out.println(ima); 
    Kanji kuruma = new Kanji("車", "car", "kuruma_on", "クルマ", "kuruma_kun", "くるま"); 
    System.out.println(kuruma); 
    System.out.println(ima); 

ich eine toString-Funktion ist die Kanji Klasse wie folgt hinzugefügt:

public String toString() { 
    return "Character="+character+" - Meaning="+meaning + "\nKunyomi=" + this.kunyomi.getRomaji() + "/" + this.kunyomi.getHiragana() + " - Onyomi="+onyomi.getRomaji()+"/"+onyomi.getKatakana(); 
} 

Und es erzeugt diese Ausgabe:

Character=今 - Meaning=now 
Kunyomi=ima_kun/いま - Onyomi=ima_on/イマ 
Character=車 - Meaning=car 
Kunyomi=kuruma_kun/くるま - Onyomi=kuruma_on/クルマ 
Character=今 - Meaning=now 
Kunyomi=kuruma_kun/くるま - Onyomi=kuruma_on/クルマ 

Wie Sie sehen können, hat das Erstellen des Kanji-Objekts, das die 'Auto'-Kanji-Informationen enthält, auch das toString-Ergebnis des Kanji-Objekts geändert, das' jetzt 'Kanji enthält Informationen

Das Problem hier ist, dass die Felder in Onyomi und Kunyomi Klassen statisch sind, was bedeutet, dass es nur eine Kopie dieser Felder in der gesamten Anwendung gibt (oder eine Kopie pro Onyomi/Kunyomi Klassen geladen, ich bin nicht sicher darüber), statt einer Kopie pro Onyomi/Kunyomi-Objekt erstellt.
Das bedeutet, dass der Kanji-Konstruktor jedes Mal, wenn Sie ein neues Kanji-Objekt erstellen, das vorherige Kunyomi-romaji- und -hiragana-Feld und das vorherige Onyomi-romaji- und katakana-Feld löscht.
So könnten Sie den statischen Modifikator der Felder zu entfernen, wie folgt aus:

public static class Onyomi { 
    public String romaji; 
    public String katakana; 
    public String getRomaji() { 
     return romaji; 
    } 

    public void setRomaji(String romaji) { 
     this.romaji = romaji; 
    } 
    public String getKatakana() { 
     return katakana; 
    } 
    public void setKatakana(String katakana) { 
     this.katakana = katakana; 
    } 

} 
public static class Kunyomi { 
    public String romaji; 
    public String hiragana; 

    public String getRomaji() { 
     return romaji; 
    } 

    public void setRomaji(String romaji) { 
     this.romaji = romaji; 
    } 

    public String getHiragana() { 
     return hiragana; 
    } 

    public void setHiragana(String hiragana) { 
     this.hiragana = hiragana; 
    } 
} 

Damit die vorherige Testcode Ausgang dieses:

Character=今 - Meaning=now 
Kunyomi=ima_kun/いま - Onyomi=ima_on/イマ 
Character=車 - Meaning=car 
Kunyomi=kuruma_kun/くるま - Onyomi=kuruma_on/クルマ 
Character=今 - Meaning=now 
Kunyomi=ima_kun/いま - Onyomi=ima_on/イマ 

, auch die Kanji initialisieren sich die Felder der von Kunyomi/Onyomi erstellten Objekte. Es sollte die Kunyomi/Onyomi Konstruktor Jobs zu tun, dass:

Im Onyomi Klasse Code, fügen Sie diese Konstrukteure:

public Onyomi() { 
     romaji = null; 
     katakana = null; 
    } 

    public Onyomi(String romaji, String katakana) { 
     this.romaji = romaji; 
     this.katakana = katakana; 
    } 

In der Kunyomi Klasse, diese Konstruktoren:

public Kunyomi() { 
     romaji = null; 
     hiragana = null; 
    } 

    public Kunyomi(String romaji, String hiragana) { 
     this.romaji = romaji; 
     this.hiragana = hiragana; 
    } 

Und im Kanji-Konstruktor können Sie so arbeiten, wie Sie es getan haben:

+0

Großes Explantat Ion.う り が と う – user2202098

+0

ど う い し し し て, user2202098 さ ん – HatsuPointerKun

1

Ihr Konstruktor zuweisen wird keine Instanz Variablen: onyomi, kunyomi. Die Klassen können statisch sein, die Variablen jedoch nicht. In jedem Fall müssen sie irgendwann initialisiert werden.

this.onyomi.romaji = oR_; 
this.onyomi.katakana = oK_; 

Vor diesen beiden Zeilen gibt es keine Initialisierung der Variablen. Tatsächlich wirft der Konstruktor eine NPE auf diese beiden Zeilen. Es sei denn, Sie verwenden den Standardkonstruktor.