【问题标题】:problem where I try to add a class to an array and it only give me null我尝试将类添加到数组的问题,它只给我 null
【发布时间】:2020-10-26 17:15:25
【问题描述】:

我有一个任务,我应该使用类在数组中建立一个村庄人口,并且数组中的每个实例都是一个特殊类,目前只包含一个布尔值,确定他们是否生病,但是它只会将 null 添加到数组中。

import java.lang.reflect.Array;
import java.util.Random;
public class Start {
    public static void main(String[] args) {
        Village village = new Village();

    }
}

class Village {
    final int SIZE = 1000;
    Person[] population = new Person[SIZE];
    Village() {
        for (int i = 0; i < SIZE; i = i + 1) {
            Person personen = new Person();
            Array.set(population, i, personen);
        }
    }
    static int countSick; {
        int sjuka = 0;
        for (Person personen: population) {
            boolean checker = personen.isSick;
            if (checker == true) {
                sjuka = sjuka + 1;
            }
        }
    }

}
class Person {
    boolean isSick;
    final double INIT_SICK_PROB = 0.32;
    Person() {
        Random rand = new Random();
        double checker = rand.nextDouble();
        if (checker <= INIT_SICK_PROB) {
            isSick = true;
        } else {
            isSick = false;
        }

    }
}

【问题讨论】:

  • 请编辑您的问题并发布代码 sn-p 而不是链接。

标签: java arrays class


【解决方案1】:

看看你的班级Village

class Village {
    final int SIZE = 1000;
    Person[] population = new Person[SIZE];
    Village() {
        for (int i = 0; i < SIZE; i = i + 1) {
            Person personen = new Person();
            Array.set(population, i, personen);
        }
    }
    static int countSick; {
        int sjuka = 0;
        for (Person personen: population) {
        boolean checker = personen.isSick;
            if (checker == true) {
                sjuka = sjuka + 1;
            }
        }
    }

}

这些行static int countSick; {...} 创建一个静态变量countSick,后跟一个代码块。

此代码块是一个初始化程序块,将在构造函数之前运行。也就是说,

for (Person personen: population) {

将被访问之前它被构造函数填充,因此抛出一个NullPointerException

您可能想让countSick 成为一个方法。为此,您需要将行更改为

public int countSick() { 

相反。这就是方法定义的样子。此外,由于您可能希望从 Village 实例访问 population 数组,因此您需要删除 static 修饰符。

另外,不要忘记在方法结尾处returnsjuka,否则会出现编译器错误。

【讨论】:

  • countSick 不应该是静态的,因为它引用了绑定到村庄对象的数据。
  • 谢谢!然而,这次我确实遇到了另一个问题,这与我尝试通过键入来使用我的 countSick 函数这一事实有关。计数=计数();我收到一条错误消息。错误:无法从静态上下文引用非静态方法 countSick()
  • @SebastianSjöberg 是的,因为您试图以静态方式调用该方法。您需要从您的 village 实例中调用它。见这里:stackoverflow.com/questions/2559527/…
【解决方案2】:

您的主要方法目前只创建一个新村庄。它的数组应该被初始化和填充,因为这发生在它的构造函数中。但是初始化后永远不会访问这些值。

“countSick”字段永远不会被访问,并且在 Village 中也被声明为静态,因此是类绑定,而字段 population 是对象绑定。我相信这是一种返回计数的方法?

您的架构总体上存在缺陷,我猜这是因为缺少有关面向对象和 Java 语言的知识?

  • 首先初始化村庄
  • 然后用人填充它的数组
  • 然后通过村庄实例访问阵列以检查生病的人

这意味着您需要 2 个实体级村庄和个人。一种可以处理村庄数组以读取患病人数的方法。还有你的 Main-Class 声明你的进程的开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多