前言
1255: 打怪升级(Java),写这个题目程序的时候,控制台提示如下错误:
Exception in thread "main" java.lang.NullPointerException
at oj1255.Main.input(Main.java:41)
at oj1255.Main.<init>(Main.java:24)
at oj1255.Main.main(Main.java:52)
然后我调试才发现,这个对象数组居然是null
的,这我就不理解了,我明明写了new
的……
于是就有了这篇博客。为了突出重点,就重新写了个类,因此直接看下面的即可,不用管前言。
参考
示例
package error.inner;
public class Outer { // 外部类
private class Inner { // 内部类
public int x; // 内部类属性
}
private Inner[] test; // 内部类对象数组
public Outer() { // 外部类构造方法
test = new Inner[2]; // 创建内部类对象数组
for(int i = 0; i < 2; i++) {
test[i].x = i; // 赋值
}
for(int i = 0; i < 2; i++) { // 输出内部类属性值
System.out.println(test[i].x);
}
}
public static void main(String[] args) {
new Outer();
}
}
乍一看,你可能会觉得这段代码没有任何问题,然而事实是在控制台丢一个Exception
给你:
Exception in thread "main" java.lang.NullPointerException
at error.inner.Outer.<init>(Outer.java:13)
at error.inner.Outer.main(Outer.java:21)
报错在第13行test[i].x = i;
,于是进入了Debug
模式
从红色箭头那一行,我们看到test[0]
是null
的,到这里应该都明白了。
我们在第11行test = new Inner[2]
的代码实际上只是申请的对象数组的大小,如下图所示:
![内存图 内存图](https://i-blog.csdnimg.cn/blog_migrate/cccd51775d551a862039e48cc6bc8162.jpeg)
堆内存里面并没有Inner
的实例,因此我们需要加1行代码(第4行)即可:
public Outer() { // 外部类构造方法
test = new Inner[2]; // 创建内部类对象数组
for (int i = 0; i < 2; i++) {
test[i] = new Inner(); // 创建对象
test[i].x = i; // 赋值
}
for (int i = 0; i < 2; i++) { // 输出内部类属性值
System.out.println(test[i].x);
}
}
其他代码都不用改,这样一来,堆中就变成了这样:
![内存图 内存图](https://i-blog.csdnimg.cn/blog_migrate/5dee9ef6c2c30aaf6882b220c584cd68.jpeg)
到这里再运行程序,就能正常输出想要的东西了:
小结
类的实例数组,每一个都需要单独创建。切记!切记!