我正在学习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
。无论如何我可以完成这个吗?
最佳答案
当你创建一个数组时,它将用它所包含的元素的默认值来填充。自 Animal
是 Object
,那么它将被 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/