2017-07-22 3 views
0

Je rencontre un problème lors de la tentative de création d'une instance de la classe kanji. Il devrait avoir 2 classes internes statiques. Chacune des classes internes doit contenir deux chaînes.Classe interne statique Java renvoyant une valeur nulle

Lorsque j'instancie la classe, elle renvoie les deux classes internes statiques comme des valeurs nulles.

La classe complète est ci-dessous. Mon constructeur est-il correct? Si je n'ai pas les classes internes et leurs chaînes comme statique je reçois une erreur.

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

Ma classe

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

Répondre

1

Je pense qu'il y a 2 problèmes dans ce code.

Le premier (ce qui provoque le fait que les onyomi et kunyomi champs sont nuls) est que, dans votre code constructeur, vous n'initialisez pas ces variables, donc pas, le constructeur est incorrect

Qu'est-ce que vous avez besoin d'ajouter dans le constructeur est ces 2 lignes:

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

avant la mise en onyomi et kunyomi champs, comme celui-ci:

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_; 
} 

Le deuxième problème apparaît avec ce code de test:

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

J'ai ajouté une fonction toString est la classe Kanji comme ceci:

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

Et il a produit cette sortie:

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/クルマ 

Comme vous pouvez le voir, la création de l'objet Kanji contenant les informations kanji 'car' a également modifié le résultat toString de l'objet Kanji contenant le 'maintenant' kanji Le problème ici est que les champs dans les classes Onyomi et Kunyomi sont statiques, ce qui signifie qu'il n'y aura qu'une seule copie de ces champs dans l'ensemble de l'application (ou une copie par classes Onyomi/Kunyomi chargées, je ne suis pas sûr à ce sujet), au lieu d'une copie par objet Onyomi/Kunyomi créé. Cela signifie qu'à chaque fois que vous créez un nouvel objet Kanji, le constructeur Kanji efface le champ précédent Kunyomi romaji et hiragana, et le champ précédent Onyomi romaji et katakana.
Vous pouvez supprimer le modificateur statique des champs, comme ceci:

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

Avec cela, la sortie précédente du code de test ceci:

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/イマ 

En outre, le Kanji s'initialiser le champs de Kunyomi/Onyomi créé des objets. Il devrait être les emplois du constructeur kunyomi/homophonie à faire:

Dans le code de classe homophonie, ajoutez ces constructeurs:

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

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

Dans la classe kunyomi, ajouter ces constructeurs:

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

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

Et dans le constructeur Kanji, vous serez capable de faire comme vous l'avez fait, ou de cette façon:

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

Grand explant ion. – user2202098

+0

En savoir plus sur user2202098 さ ん – HatsuPointerKun

1

Votre constructeur n'assignant une instance aux variables: onyomi, kunyomi. Les classes peuvent être statiques mais les variables ne le sont pas. De toute façon à un moment donné, ils ont besoin d'initialisation.

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

Avant ces deux lignes, il n'y a pas d'initialisation des variables. En fait, le constructeur lance un NPE sur ces deux lignes. Sauf si vous utilisez le constructeur par défaut.