我是java的新手,在使用对象数组时遇到了问题。我的主要计划是这样的:
package bicycledemo;
class BicycleDemo {
public static void main(String[] args) {
// Create two different
// Bicycle objects with an array
Bicycle[] bike = new Bicycle[2];
bike[0].cadence=50; //line 10, where the NullPointerException prompts out
bike[0].gear=2;
bike[1].cadence=10;
bike[1].gear=3;
System.out.println("gear: "+bike[0].gear+"\n"+"cadence: "+bike[0].cadence+"\n");
System.out.println("gear: "+bike[1].gear+"\n"+"cadence: "+bike[1].cadence+"\n");
System.out.println("\b");
}
}
和Bicycle类就是这个:
package bicycledemo;
public class Bicycle {
public Bicycle() {
}
public int cadence;
public int gear;
}
运行程序时,输出错误为:
Exception in thread "main" java.lang.NullPointerException
at bicycledemo.BicycleDemo.main(BicycleDemo.java:10)
Java Result: 1
我认为发生的事情是对象自行车没有正确创建,但我不明白为什么。
非常感谢你的帮助!我真的很想解决这个问题!
答案 0 :(得分:4)
这一行:
Bicycle[] bike = new Bicycle[2];
创建一个数组。它有两个元素,两个元素最初都是空引用。您尚未创建任何Bicycle
个对象。然后在下一个声明中:
bike[0].cadence=50;
...你试图取消引用那个空值。在将数组元素用作对象之前,需要初始化数组元素:
// Set the first element of the array to refer to a newly created object
bike[0] = new Bicycle();
// Then this will be fine
bike[0].cadence = 50;
如果您不明白这里发生了什么,那么真的非常重要,您可以更仔细地研究它。理解引用和对象之间的区别(并理解变量和数组只永远包含引用或原始值,从不对象)是Java的基础。直到你“得到”,你将遇到各种各样的困难。
请注意,您还可以更改Bicycle
类,以包含以节奏和齿轮作为参数的构造函数:
public Bicycle(int cadence, int gear) {
this.cadence = cadence;
this.gear = gear;
}
然后您可以将初始化更改为:
bike[0] = new Bicycle(50, 2);
bike[1] = new Bicycle(10, 3);
甚至作为数组创建的一部分:
Bicycle[] bike = {
new Bicycle(50, 2),
new Bicycle(10, 3)
};
答案 1 :(得分:2)
你从未初始化你的数组元素。因此,当你的数组元素是一个对象时,它们会被初始化为默认值null 。因此,当您尝试在索引处调用元素时,它会抛出 NPE 。
Bicycle[] bike = new Bicycle[2];// initializes the array with size 2
but the elements hold default
values(null in this case)
bike[0] = new Bicycle();// initializing the array element at index 0
bike[1] = new Bicycle();// initializing the array element at index 1
当然,更好的设计也是使用2-args Bicycle构造函数并在其中初始化属性。或者为属性设置setter和getter。
public Bicycle(int cadence, int gear){
this.cadence = cadence;
this.gear = gear;
}
然后,
bike[0] = new Bicycle(2, 2);
bike[1] = new Bicycle(3, 5);
答案 2 :(得分:2)
您需要先填充数组:
Bicycle[] bike = new Bicycle[2];
bike[0] = new Bicycle();
bike[1] = new Bicycle();
否则,您创建一个只包含空元素的数组。
答案 3 :(得分:2)
在开始访问其属性之前,必须将数组中的每个索引设置为新实例。
Bicycle[] bike = new Bicycle[2];
bike[0] = new Bicycle(); // add this
bike[0].cadence=50;
...
答案 4 :(得分:0)
您创建了一个对象数组并在不初始化的情况下访问它们。
bike = [null, null] - your result