Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
抛出Java.lang.NoSuchFieldError的内部类的Java数组_Java_Inner Classes - Fatal编程技术网

抛出Java.lang.NoSuchFieldError的内部类的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;

经过很长一段时间后,我正在努力复习java。 非常感谢您的帮助

为了演示,我有一个动物类,它有一系列内部器官类

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