zoukankan      html  css  js  c++  java
  • 给内部类对象数组属性赋值时报错:Exception in thread "main" java.lang.NullPointerException

    前言

            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的……


    于是就有了这篇博客。为了突出重点,就重新写了个类,因此直接看下面的即可,不用管前言。

    参考博客

    跳币上山岭的博客

    示例1

    package error.inner;
    
    // 外部类
    public class Outer {
    	
    	// 内部类
    	private class Inner {
    		public int x;	// 属性
    	}
    	
    	private Inner[] test;	// 内部类对象数组
    	
    	// 构造方法
    	public Outer() {
    		int i;
    		test = new Inner[2];	// 创建实例
    		for(i = 0; i < 2; i++) {
    			test[i].x = i;		// 赋值
    		}
    		// 输出内部类属性值
    		for(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 oj1255.Outer.<init>(Outer.java:18)
    	at oj1255.Outer.main(Outer.java:27)
    

    报错在第18行test[i].x = i;,于是进入了Debug模式
    error.inner从红色箭头那一行,我们看到test[0]null的,到这里应该都明白了。
    我们在第16行test = new Inner[2]的代码实际上只是申请的对象数组的大小,如下图所示:
    堆栈1
    堆内存里面并没有Inner的实例,因此我们需要加1行代码即可:

    	// 构造方法
    	public Outer() {
    		int i;
    		test = new Inner[2];	// 创建Inner数组
    		for(i = 0; i < 2; i++) {
    			test[i] = new Inner();	// 创建实例
    			test[i].x = i;		// 赋值
    		}
    		// 输出内部类属性值
    		for(i = 0; i < 2; i++) {
    			System.out.println(test[i].x);
    		}
    	}
    

    其他代码都不用改,这样一来,堆中就变成了了这样:
    堆栈2到这里在运行程序,就能正常输出想要的东西了:

    输出

    小结

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


  • 相关阅读:
    iframe跨页面调用函数
    $.extend()
    tab标签 插件 by 腾讯 jianminlu
    click事件多次触发 jQuery
    vertical-align
    display:inline-block
    在父页面访问iframe的东西
    2019牛客多校第三场
    2019HDU多校第一场
    2019江苏省赛
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060833.html
Copyright © 2011-2022 走看看