给内部类对象数组属性赋值时报错:Exception in thread "main" java.lang.NullPointerException

5 篇文章 0 订阅

前言

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模式

error.inner
从红色箭头那一行,我们看到test[0]null的,到这里应该都明白了。
我们在第11行test = new Inner[2]的代码实际上只是申请的对象数组的大小,如下图所示:

内存图

堆内存里面并没有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);
		}
	}

其他代码都不用改,这样一来,堆中就变成了这样:

内存图

到这里再运行程序,就能正常输出想要的东西了:
结果

小结

类的实例数组,每一个都需要单独创建。切记!切记!


  • 69
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值