Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 为什么返回空的arraylist?_Java_Arrays_Construct - Fatal编程技术网

Java 为什么返回空的arraylist?

Java 为什么返回空的arraylist?,java,arrays,construct,Java,Arrays,Construct,我想创建两个构造函数,一个用于创建具有年龄和名称的人类,另一个用于使用第一个构造函数创建具有随机年龄和名称的人类 我创建一个名称数组[Name1,Name2,…,Name9]并选择一个随机名称,然后我创建一个介于1-100之间的随机年龄,并将其存储为rage,最后我创建一个带有随机名称和年龄的人 在我的主要方法中,我想创建一个包含9个随机人的arraylist并将其打印出来,但我只得到了9个名为:null且年龄为0的人。任何帮助都将不胜感激 class Human { int age;

我想创建两个构造函数,一个用于创建具有
年龄和
名称的
人类
,另一个用于使用第一个构造函数创建具有随机年龄和名称的人类

我创建一个名称数组
[Name1,Name2,…,Name9]
并选择一个随机名称,然后我创建一个介于1-100之间的随机年龄,并将其存储为
rage
,最后我创建一个带有随机
名称
年龄

在我的主要方法中,我想创建一个包含9个随机人的arraylist并将其打印出来,但我只得到了9个名为:
null
且年龄为0的人。任何帮助都将不胜感激

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);
    }
}
类人类{
智力年龄;
字符串名;
公共人员(int myAge,字符串myName){
name=myName;
年龄=我的年龄;
}
公共人权(){
ArrayList randomnames=新的ArrayList();
对于
Human()
构造函数中的(int j=1;j),您编写了

Human randomPerson = new Human(rage,rname);
这不会初始化您的
人员
,而是创建另一个对象

正确的做法是:

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())); 
}
请注意,
randomAge()
randomName()
必须声明为
static
,因为在调用
this()
之前不能调用非静态方法,因为对象还不存在。

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

Human randomPerson = new Human(rage,rname);
这不会初始化您的
人员
,而是创建另一个对象

正确的做法是:

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())); 
}
请注意,
randomAge()
randomName()
必须声明为
static
,因为在调用
this()
之前不能调用非静态方法,因为对象还不存在。

ArrayList randomName=new ArrayList();
的范围仅限于
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);
}
ArrayList randomnames=new ArrayList();
的作用域仅限于
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);
}

在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); 
}
public-Human(){
ArrayList randomnames=新的ArrayList();

for(int j=1;j在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); 
}
public-Human(){
ArrayList randomnames=新的ArrayList();

对于(int j=1;j,如另一个答案中所述,这不起作用:

Human randomPerson = new Human(rage,rname);
但是使用

this(rage, rname);
也不起作用,因为它不是构造函数中的第一行

链接:

因此,不要调用其他构造函数,只需执行以下操作:

this.age = rage;
this.name = rname;

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

Human randomPerson = new Human(rage,rname);
但是使用

this(rage, rname);
也不起作用,因为它不是构造函数中的第一行

链接:

因此,不要调用其他构造函数,只需执行以下操作:

this.age = rage;
this.name = rname;

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

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

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

创建这两个函数后,第二个构造函数可以说
this(randomAge(),randomName())
一个解决方案是编写
this(rage,rname)
,但这只在它是构造函数的第一行时起作用。要使它成为构造函数的第一行,需要先创建两个函数

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

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

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

格式化代码,请回答“返回空数组列表”是什么意思?@Pshemo;它正在返回一个包含9个对象的arraylist,这些对象的名称为null,年龄为0。未设置该对象的属性。arraylist不是null。请格式化您的代码,“返回null arraylist”是什么意思?@Pshemo;它返回了一个包含9个对象的arraylist,该对象的名称为null,年龄为0。该对象的属性未设置。arraylist不是null谢谢你的回答!它说构造函数调用必须是my Human()中的第一条语句-构造函数,但这对我不起作用,因为我只在我的Human()构造函数的末尾创建rage和rname,所以我不能将此(rage,rname);作为我的第一行来编写。这的第一部分是正确的。但是,
this(rage,rname)
是不正确的,因为您必须首先将其放在动态创建属性的位置。您可以生成ArrayList并将其作为
静态
变量存储在类中。然后您可以做一个很好的小技巧,将所有内容放在一行中,如下所示: