java - 对象数组的问题

标签 java arrays arraylist nullpointerexception

我正在学习java并且正在尝试一些东西。这就是我正在努力做的事情。

我正在尝试创建一个对象数组的表。 例如我正在创建一个名为“动物”的对象,通过它我可以根据用户选择添加任意数量的动物及其品种。

package tt;

import java.util.Scanner;

public class animal {

    String aname;
    String abreed;

    public animal() {

        mainprog aa = new mainprog();

        System.out.printf("eneter name of your %s..\n", aa.Animalcat);
        Scanner name = new Scanner(System.in);
        aname = name.nextLine();

        System.out.printf("eneter breed of your %s..\n", aa.Animalcat);
        Scanner breed = new Scanner(System.in);
        abreed = breed.nextLine();

    }

    public String getbreed() {
        return abreed;

    }

    public String getname() {
        return aname;
    }
}

因此主程序询问我要添加多少动物。

package tt;

import java.util.Scanner;

public class mainprog {

    public static String Animalcat;

    public static void main(String[] args) {

        System.out.println("How many animals you want to add..");

        Scanner an = new Scanner(System.in);

        int animalNumbers = an.nextInt();

        animal[][] addAnimal = new animal[animalNumbers][1];
        animaltype[] at = new animaltype[animalNumbers];

        for (int i = 0; i < animalNumbers; i++) {

            at[i] = new animaltype();
            Animalcat = at[i].getAnimalType();

            for (int j = 0; j < 1; j++) {

                addAnimal[i][j] = new animal();
            }
        }

        Display(addAnimal, at);

    }

    public static void Display(animal x[][], animaltype y[]) {
        System.out.println("Your animals are..");
        for (int m = 0; m < x.length; m++) {
            System.out.printf("Following are the name and the breed of %s ",
                    y[m].getAnimalType());
            System.out.println();
            for (int n = 0; n < x[m].length; n++) {

                System.out.printf(" %s", x[m][n].aname);
                System.out.printf(" %s", x[m][n].abreed);
                System.out.println();

            }
        }
    }

}
<小时/>
package tt;

import java.util.Scanner;

public class animaltype {
    String animalType;

    public animaltype() {
        System.out.println("What kind of animal you want to add..");
        Scanner at = new Scanner(System.in);
        animalType = at.nextLine();
    }

    public String getAnimalType(){
        return animalType;
    }

}

我遇到的问题是我可以询问我想要添加多少种动物,但我无法控制我想要添加多少种该类型的动物。 在添加动物时,我只能通过将其声明为 [1] 来手动添加 1 只动物,而不能通过用户输入来添加。

addAnimal = new animal[animalNumbers][1];

问题在于我是否可以通过声明 animal[][] addAnimal = null; 来做到这一点,然后用如下方式初始化它:

animal[][] addAnimal = new animal[animalNumbers][animaltypenumbers];

但我总是收到 NullPointerException 。无论如何我可以完成这个吗?

最佳答案

当你创建一个数组时,它将用它所包含的元素的默认值来填充。自 AnimalObject ,那么它将被 null 填充值,并且您不能使用具有 null 的任何变量值(value)。因为你只是填写 animal[i][0]在您当前的代码中,您不会遇到任何问题。但当你尝试访问 animal[i][1] 时就会出现。这发生在 Display方法:

public static void Display(animal x[][], animaltype y[]) {
    System.out.println("Your animals are..");
    for (int m = 0; m < x.length; m++) {
        System.out.printf("Following are the name and the breed of %s ",
                y[m].getAnimalType());
        System.out.println();
        for (int n = 0; n < x[m].length; n++) {
            //you only filled elements in x[m][0]
            //x[m][n] when n > 0 is null
            //so you will get NullPointerException
            System.out.printf(" %s", x[m][n].aname);
            System.out.printf(" %s", x[m][n].abreed);
            System.out.println();

        }
    }
}

更好的选择:

使用Animal[] addAnimal相反,您不需要将其作为数组的数组:

public static void main(String[] args) {
    System.out.println("How many animals you want to add..");
    Scanner an = new Scanner(System.in);
    int animalNumbers = an.nextInt();
    animal[] addAnimal = new animal[animalNumbers];
    animaltype[] at = new animaltype[animalNumbers];
    for (int i = 0; i < animalNumbers; i++) {
        //at[i] = new animaltype();
        //Animalcat = at[i].getAnimalType();
        Animalcat = new animaltype();
        //for (int j = 0; j < 1; j++) {
        //    addAnimal[i][j] = new animal();
        //}
        addAnimal[i] = Animalcat;
    }
    Display(addAnimal, at);
}
//modify Display method accordingly

更好的选择:

使用List<Animal>ArrayList<Animal> 支持而不是Animal[]List让您处理动态增长的元素列表。

public static void main(String[] args) {
    System.out.println("How many animals you want to add..");
    Scanner an = new Scanner(System.in);
    int animalNumbers = an.nextInt();
    List<Animal> animals = new ArrayList<Animal>();
    for (int i = 0; i < animalNumbers; i++) {
        Animalcat = new animaltype();
        animals.add(Animalcat);
    }
    Display(animals);
}
//modify Display method accordingly

关于java - 对象数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23557587/

相关文章:

java - 有没有更简单的方法来解析 Java 中的 XML?

java - 在支架开口上展示功能原型(prototype)

Java 绘制速度相对于颜色模型

php - 如何合并关联数组的特定部分?

java - Hashmap 中的 NullPointerException 错误

java - 如何将txt文件中的数据输入到数组列表中。涉及多种数据类型和作为其他类的变量的类对象

android - 通过 Bundle 传递 ArrayList 对象?

java - 类路径问题 - getJNIEnv 失败

java - 尝试用Java逐行读取文件

javascript - 使用扩展运算符使用 react 钩子(Hook)更新映射函数内的状态