抛出Java.lang.NoSuchFieldError的内部类的Java数组
经过很长一段时间后,我正在努力复习java。 非常感谢您的帮助 为了演示,我有一个动物类,它有一系列内部器官类抛出Java.lang.NoSuchFieldError的内部类的Java数组,java,inner-classes,Java,Inner Classes,经过很长一段时间后,我正在努力复习java。 非常感谢您的帮助 为了演示,我有一个动物类,它有一系列内部器官类 public class Animal { String nameOfAnimal; Organs [] vitalOrgans = new Organs[3]; public Animal() { } public String getNameOfAnimal() { return nameOfAnimal;
public class Animal
{
String nameOfAnimal;
Organs [] vitalOrgans = new Organs[3];
public Animal()
{
}
public String getNameOfAnimal() {
return nameOfAnimal;
}
public void setNameOfAnimal(String nameOfAnimal) {
this.nameOfAnimal = nameOfAnimal;
}
@Override
public String toString() {
return "Animal{" + "nameOfAnimal=" + nameOfAnimal + "}";
}
class Organs{
String nameOfOrgan;
public String getNameOfOrgan() {
return nameOfOrgan;
}
public void setNameOfOrgan(String nameOfOrgan) {
this.nameOfOrgan = nameOfOrgan;
}
@Override
public String toString() {
return "Organs{" + "nameOfOrgan=" + nameOfOrgan + '}';
}
}} 现在,当我调用时,在驱动程序文件中并没有语法错误,但我得到了“线程中的异常”main“java.lang.NoSuchFieldError:Vitalogans” 怎样才能使这个(或类似的想法)起作用呢。
谢谢 获取相关的代码位:
public class Animal
{
//...
Organs [] vitalOrgans = new Organs[3];
//...
}
由于您的vitalogans
声明从未被赋予访问修饰符(即private
、public
、protected
)之一),因此它采用默认访问权限,这意味着只有同一包中的其他类可以看到它。因为您的另一个代码块不在同一个包中,所以它无法看到该字段
一个最简单可行的修改就是将访问权限设置为public
:
public class Animal
{
//...
public Organs [] vitalOrgans = new Organs[3];
//...
}
虽然这是可行的,但它不一定是最好的解决方案,因为如果您曾经更改Vitalogans的表示方式,或者需要执行任何验证,那么这些编辑必须在整个应用程序中进行。因此,一个更好的解决方案(也是Java中一个主要的风格惯例,因为这些确切的原因)是通过方法将其(以及您的所有字段)私有化和访问:
public class Animal {
private String nameOfAnimal;
private Organs[] vitalOrgans = new Organs[3];
//...
public Organs[] getVitalOrgans() {
return vitalOrgans;
}
//Alternative accessor that fetches only one organ.
public Organs getVitalOrgan(int index) {
if(index >= 0 && index < vitalOrgans.length)
return vitalOrgans[index];
else
return null;
}
public void setVitalOrgans(Organs[] vitalOrgans) {
this.vitalOrgans = vitalOrgans
}
//...
}
另外,正如Ari在回答中提到的,不要忘记初始化数组中的器官,否则会得到NullPointerException 您需要使用新器官初始化维他洛格兰()。比如:
您正在创建一个包含3个空器官的数组。因此,在访问“VitalLorgans[i]”时出现空指针异常。NoSuchFieldError!=NullPointerException。您的标题描述NullPointerException;你的正文描述了一个非常不同的错误…(如果你能更容易地格式化你的代码也会有帮助-使用后期预览,这样你就可以确保它看起来像你想要的那样…)对!修复了标题错误。这不会解决NoSuchField错误,但会解决他修复后将遇到的下一个错误。这取决于驱动程序的位置-如果它在同一个包中-“Vitalogans”可见(默认情况下,变量具有包作用域)。如果在外面,那么“Vitalogans”需要公开,或者更好的是需要一个“Vitalogans”的getter。好吧,他确实说他在最初的问题中有一个NoSuchField错误,所以肯定没有,因此我最初的评论。感谢@Brandon提供详细信息。
public class Animal {
private String nameOfAnimal;
private Organs[] vitalOrgans = new Organs[3];
//...
public Organs[] getVitalOrgans() {
return vitalOrgans;
}
//Alternative accessor that fetches only one organ.
public Organs getVitalOrgan(int index) {
if(index >= 0 && index < vitalOrgans.length)
return vitalOrgans[index];
else
return null;
}
public void setVitalOrgans(Organs[] vitalOrgans) {
this.vitalOrgans = vitalOrgans
}
//...
}
Animal.Organs futureMammalHeart = mamal.getVitalOrgan(0); //Animal.Organs due to Organs being an inner class.
if(futureMammalHeart != null) //Demonstration of null check. Safety first!
futureMammalHeart.setNameOfOrgan("Heart");
Animal.Organs[] mammalianVitalOrgans = mamal.getVitalOrgans();
if(mammalianVitalOrgans != null) //Just in case...
System.out.println(mamal.mammalianVitalOrgans[0].getNameOfOrgan());
public Animal() {
for (int i = 0; i < vitalOrgans.length; i++) {
vitalOrgans[i] = new Organs();
}
}
Organs[] vitalOrgans = new Organs[3];