Java 静态内部 类 返回 null
Java static inner classes returning null
我在尝试创建汉字 class 实例时遇到问题。它应该有 2 个静态内部 classes。每个内部 classes 应该包含两个字符串。
当我实例化 class 时,它 returns 两个静态内部 classes 为空值。
完整 class 如下。我的构造函数是否正确?如果我没有内部 classes 和它们的静态字符串,我会抛出一个错误。
Kanji kanji = new Kanji("aaa","bbb","ccc","ddd","eee","fff" );
我的class
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;
}
}
您的构造函数未将任何实例分配给变量:onyomi、kunyomi。 类 可能是静态的,但变量不是。无论哪种方式,在某些时候他们都需要初始化。
this.onyomi.romaji = oR_;
this.onyomi.katakana = oK_;
这两行之前没有对变量进行初始化。事实上,构造函数在这两条线上抛出了一个 NPE。除非你使用默认构造函数。
我认为这段代码有两个问题。
第一个(导致 onyomi
和 kunyomi
字段为空的事实)是,在您的构造函数代码中,您没有初始化这些变量,所以不,构造函数不正确
你需要在构造函数中添加的是这两行:
this.onyomi = new Onyomi();
this.kunyomi = new Kunyomi();
在设置 onyomi
和 kunyomi
字段之前,像这样:
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_;
}
此测试代码出现第二个问题:
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);
我添加了一个 toString 函数是这样的汉字 class :
public String toString() {
return "Character="+character+" - Meaning="+meaning + "\nKunyomi=" + this.kunyomi.getRomaji() + "/" + this.kunyomi.getHiragana() + " - Onyomi="+onyomi.getRomaji()+"/"+onyomi.getKatakana();
}
它产生了这个输出:
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/クルマ
如您所见,创建包含 'car' 汉字信息的 Kanji 对象也更改了包含 'now' 汉字信息的 Kanji 对象的 toString 结果
这里的问题是 Onyomi 和 Kunyomi classes 中的字段是静态的,这意味着这些字段在整个应用程序中只有一个副本(或每个 Onyomi/Kunyomi 一个副本classes 已加载,我不确定 ),而不是每个 Onyomi/Kunyomi 创建的对象一个副本。
这意味着每次创建一个新的 Kanji 对象时,Kanji 构造函数都会擦除之前的 Kunyomi 罗马字和平假名字段,以及之前的 Onyomi 罗马字和片假名字段。
所以你可能想删除字段的静态修饰符,像这样:
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;
}
}
至此,之前的测试代码输出如下:
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/イマ
此外,汉字会自行初始化 Kunyomi / Onyomi 创建的对象的字段。这应该是 Kunyomi / Onyomi 构造函数的工作:
在 Onyomi class 代码中,添加这些构造函数:
public Onyomi() {
romaji = null;
katakana = null;
}
public Onyomi(String romaji, String katakana) {
this.romaji = romaji;
this.katakana = katakana;
}
在 Kunyomi class 中,添加这些构造函数:
public Kunyomi() {
romaji = null;
hiragana = null;
}
public Kunyomi(String romaji, String hiragana) {
this.romaji = romaji;
this.hiragana = hiragana;
}
并且在 Kanji 构造函数中,您将能够像以前那样做,或者这样 :
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_);
}
我在尝试创建汉字 class 实例时遇到问题。它应该有 2 个静态内部 classes。每个内部 classes 应该包含两个字符串。
当我实例化 class 时,它 returns 两个静态内部 classes 为空值。
完整 class 如下。我的构造函数是否正确?如果我没有内部 classes 和它们的静态字符串,我会抛出一个错误。
Kanji kanji = new Kanji("aaa","bbb","ccc","ddd","eee","fff" );
我的class
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;
}
}
您的构造函数未将任何实例分配给变量:onyomi、kunyomi。 类 可能是静态的,但变量不是。无论哪种方式,在某些时候他们都需要初始化。
this.onyomi.romaji = oR_;
this.onyomi.katakana = oK_;
这两行之前没有对变量进行初始化。事实上,构造函数在这两条线上抛出了一个 NPE。除非你使用默认构造函数。
我认为这段代码有两个问题。
第一个(导致 onyomi
和 kunyomi
字段为空的事实)是,在您的构造函数代码中,您没有初始化这些变量,所以不,构造函数不正确
你需要在构造函数中添加的是这两行:
this.onyomi = new Onyomi();
this.kunyomi = new Kunyomi();
在设置 onyomi
和 kunyomi
字段之前,像这样:
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_;
}
此测试代码出现第二个问题:
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);
我添加了一个 toString 函数是这样的汉字 class :
public String toString() {
return "Character="+character+" - Meaning="+meaning + "\nKunyomi=" + this.kunyomi.getRomaji() + "/" + this.kunyomi.getHiragana() + " - Onyomi="+onyomi.getRomaji()+"/"+onyomi.getKatakana();
}
它产生了这个输出:
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/クルマ
如您所见,创建包含 'car' 汉字信息的 Kanji 对象也更改了包含 'now' 汉字信息的 Kanji 对象的 toString 结果
这里的问题是 Onyomi 和 Kunyomi classes 中的字段是静态的,这意味着这些字段在整个应用程序中只有一个副本(或每个 Onyomi/Kunyomi 一个副本classes 已加载,我不确定 ),而不是每个 Onyomi/Kunyomi 创建的对象一个副本。
这意味着每次创建一个新的 Kanji 对象时,Kanji 构造函数都会擦除之前的 Kunyomi 罗马字和平假名字段,以及之前的 Onyomi 罗马字和片假名字段。
所以你可能想删除字段的静态修饰符,像这样:
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;
}
}
至此,之前的测试代码输出如下:
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/イマ
此外,汉字会自行初始化 Kunyomi / Onyomi 创建的对象的字段。这应该是 Kunyomi / Onyomi 构造函数的工作:
在 Onyomi class 代码中,添加这些构造函数:
public Onyomi() {
romaji = null;
katakana = null;
}
public Onyomi(String romaji, String katakana) {
this.romaji = romaji;
this.katakana = katakana;
}
在 Kunyomi class 中,添加这些构造函数:
public Kunyomi() {
romaji = null;
hiragana = null;
}
public Kunyomi(String romaji, String hiragana) {
this.romaji = romaji;
this.hiragana = hiragana;
}
并且在 Kanji 构造函数中,您将能够像以前那样做,或者这样 :
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_);
}