为什么这会返回null arraylist?

时间:2017-11-03 15:59:49

标签: java arrays construct

我想创建两个构造函数,一个用Human创建一个age和一个name,另一个用第一个构造函数创建一个带的人随机年龄和名称。

我创建了一个名为[Name1, Name2,...,Name9]的数组并挑出一个随机名称,然后创建一个介于1-100之间的随机年龄并将其存储为rage,最后创建一个Human随机nameage

在我的主要方法中,我想创建一个由9个随机人组成的arraylist并将其打印出来,但我只得到9个名字为null并且年龄为0的人类。任何帮助都将不胜感激!< / p>

class Human {
    int age;
    String name;

    public Human (int myAge, String myName) {
        name = myName;
        age = myAge;
    }

    public Human() {
        ArrayList<String> randomnames = new ArrayList<String>();
        for (int j=1;j<10;j++) {
            randomnames.add("Namn"+j);
        }
        Random randomGenerator = new Random();
        int index = randomGenerator.nextInt(randomnames.size());
        String rname = randomnames.get(index); 

        int rage = (int) (Math.random()*100)

        Human randomPerson = new Human(rage,rname);
    }

    public static void main (String[] args) {

        ArrayList<Object> randomHumans = new ArrayList<Object>();
            for (int j=1;j<10;j++) {
                Human randomPerson = new Human();
                randomHumans.add(randomPerson);
            }
        System.out.println(randomHumans);
    }
}

5 个答案:

答案 0 :(得分:1)

Human()构造函数中,您编写了

Human randomPerson = new Human(rage,rname);

这不会初始化您的Human,而是会创建另一个对象。

正确的做法是:

this(rage,rname); // Invoke Human(int, String) constructor

因为this()必须是第一行,所以你可以编写辅助方法,如:

private static int randomAge(){
    return (int) (Math.random()*100);
}

private static String randomName(){
    ArrayList<String> randomnames = new ArrayList<String>();
    for (int j=1;j<10;j++) {
        randomnames.add("Namn"+j);
    }
    return randomnames.get((int)(Math.random()*randomnames.size())); 
}

然后你的构造函数只是

public Human(){
    this(randomAge(),randomName());
}

请注意randomAge()randomName()必须声明为static,因为在调用this()之前无法调用非静态方法,因为该对象不存在爱好。

答案 1 :(得分:1)

您在Human()构造函数中执行的所有操作都不会影响根本创建的Human对象的内部属性。

以下是解决问题的Human()构造函数的变体:

public Human() {
    ArrayList<String> randomnames = new ArrayList<String>();

    for (int j=1;j<10;j++) {
        randomnames.add("Namn"+j);
    }

    age = (int) (Math.random()*100);

    Random randomGenerator = new Random();
    int index = randomGenerator.nextInt(randomnames.size());

    name = randomnames.get(index); 
}

答案 2 :(得分:1)

正如另一个答案中所述,这不起作用:

clone()

但使用

Human randomPerson = new Human(rage,rname);

无法工作,因为它不是构造函数中的第一行。

链接:Why do this() and super() have to be the first statement in a constructor?

所以不要只调用其他构造函数来执行此操作:

this(rage, rname);

答案 3 :(得分:1)

一种解决方案是编写this(rage,rname)但这仅在构造函数中的第一行才有效。要使它成为构造函数中的第一行,需要首先创建两个函数。

private int randomAge(){
    return randomGenerator.nextInt(100);
}

private String randomName(){
    return "Namn"+randomGenerator.nextInt(10);
}

创建这两个函数后,第二个构造函数可以说this(randomAge(),randomName())

答案 4 :(得分:-1)

ArrayList<String> randomnames = new ArrayList<String>();作用域Human(),而不是main()。您不需要它只从列表中提取随机名称。

您的Human课程并不关心ArrayList。它有两个字段,就是这样。

  

在我的主要方法中,我想创建一个由9个随机人组成的arraylist

你需要在main()中制作随机的人类,而不是从new Human()调用

将该代码完全移至main(),而不是重复其尝试。

例如,

public static void main() {

    // Make your list
    List<Human> randomHumans = new ArrayList<>();
    Random randomGenerator = new Random();

    for (int j = 1; j <= 10; j++) {
        // Get the random data
        String randomName = "Namn"+j;
        int rage = (int) (Math.random()*100);

        // add the human
        randomHumans.add(new Human(randomName, rage););
    }

    System.out.println(randomHumans);
}
  

使用第一个构造函数创建具有随机年龄和名称的人

这可以简单地写成

public Human() {
    Random randomGenerator = new Random();
    this.name = "Namn"+randomGenerator.nextInt(10);
    this.age = randomGenerator.nextInt(100);
}