一、起因

采用下面的代码为对象数组里面的每个元素的字段赋值时报错。

public class StudentArray {public static void main(String[] args){Student[] stuArr = new Student[5]; //创建对象数组,stuArr存储地址for(int i = 0; i < stuArr.length; ++i){System.out.println(stuArr[i]); //nullstuArr[i].number = i + 1; //报错stuArr[i].state = (int)Math.round(Math.random() * 3);stuArr[i].score = (int)Math.round(Math.random() * 100);System.out.println(stuArr[i]);}}
}class Student{int number;int state;int score;@Overridepublic String toString() {return "Student{" +"number=" + number +", state=" + state +", score=" + score +'}';}
}

错误信息如下:自定义对象数组的元素的值为null,报空指针异常。

null
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "number" because "stuArr[i]" is nullat com.zhangqu.java.method.StudentArray.main(StudentArray.java:19)

原因分析:因为Student[] stuArr = new Student[5];创建对象数组时,返回系统为该对象数组在堆区分配的空间的地址,并将地址值存储到引用变量stuArrstuArr的数据类型为类数组Student[],是引用类型;而该数组的每一个元素都是类Student的对象(本质是引用,存储null或地址值),数组的每一个元素的数据类型为类Student,也是引用类型,由于没有继续使用new为这些引用类型Student类对象分配空间,所有数组的元素默认被初始化为null

不较真的情况下,可以把Student[] stuArr = new Student[5];看做如下形式:

Student stu1 = null;
Student stu2 = null;
......
Student stu5 = null;
Student[] stuArr = {stu1, stu2, ..., stu5}

二、正确代码

public class StudentArray {public static void main(String[] args){Student[] stuArr = new Student[5]; //创建对象数组,stuArr存储地址, 初始化变量stuArrint num = 0;for (Student stu : stuArr) {System.out.println(stu); //nullstu = new Student(); //用new分配空间,显式的为数组的每一个元素赋值,stu存储地址System.out.println(stu);System.out.println(stu.getClass().toString()); //获取数据类型stu.number = ++num;stu.state = (int)Math.round(Math.random() * 3);stu.score = (int)Math.round(Math.random() * 100);System.out.println(stu);}}
}class Student{int number;int state;int score;@Overridepublic String toString() {return "Student{" +"number=" + number +", state=" + state +", score=" + score +'}';}
}

运行结果:

null
Student{number=0, state=0, score=0}
class com.zhangqu.java.method.Student
Student{number=1, state=1, score=10}
null
Student{number=0, state=0, score=0}
class com.zhangqu.java.method.Student
Student{number=2, state=0, score=42}
......

内存分析概要图如下:

    由于是自定义的类,所以创建对象数组时,第一步是用new为数组对象本身分配空间(初始化),第二步是用new为数组对象的元素分配空间(赋值)。

public class StudentArray {public static void main(String[] args){}@Testvoid testObjArr(){StuObjArr[] stuObjArrs = new StuObjArr[2]; //第一步,为对象数组分配空间,初始化stuObjArrsfor(int i = 0; i < stuObjArrs.length; i++){stuObjArrs[i] = new StuObjArr(); //第二步,为数组元素分配空间,为stuObjArrs[i]赋值System.out.println(stuObjArrs[i]); //打印数组元素在堆区的地址}}
}class StuObjArr{int id;String name;
}

运行结果:

com.zhangqu.java.method.StuObjArr@2a70a3d8
com.zhangqu.java.method.StuObjArr@289d1c02

最后附上一张数据类型图,基础真的很重要。
引用类型的变量,只能存储两类值,null或地址值(含变量的数据类型)

Java自定义类创建对象数组并赋值相关推荐

  1. java自定义类创建数组_java 创建自定义数组

    1.java创建自定义类数组方法: student []stu = new student[3]; for(int i = 0; i < 3; i ++) { stu[i] = new stud ...

  2. 理解Java自定义类作为数据类型——引用数据类型

    目录 说在前面的话 复现问题 引用数据类型的理解 总结 说在前面的话 前言:Java的数据类型按照类型可分为基本数据类型(byte.short.int.long.double.float.char.b ...

  3. Java 自定义类数组的初始化

    1 简介 若初始化不到位,常遇到"空指针异常"(java.lang.NullPointerException)的问题. 此类解决方案是:在声明自定义类数组后,必须再对每一个数组元素 ...

  4. Java自定义类数组的创建和使用

    目录 一.数组核心概念 1.数组是什么? 2.数组优点 3.数组缺点 4.数组用处 二.封装一个自定义数组类MyList 1.数组属性定义 2.数组初始化方法 3.数组扩容方法 4.增加元素方法 5. ...

  5. java自定义类序列化_【java】面试官问我,如何实现一个自定义序列化

    通常离开内存的东西,如果需要存储或传输是需要序列化的,在java中要序列化是要实现Serializable的(或其子类),那不实现Serializable,如何实现一个自定义的序列化呢,我首先想到的是 ...

  6. java自定义类怎么比大小_实战:Java 扑克牌比较游戏

    一.目的 通过实现一个简单的扑克牌比大小的游戏,体会面向对象编程的思想. 二.技术 1.常量类 2.类的创建,封装 3.单例模式 4.自定义异常类 三.如何使用 1.常量类 对于程序运行过程中,一直不 ...

  7. Java——Arrays类操作数组的工具类

    JDK中提供了一个专门用于操作数组的工具类,即 Arrays 类,位于 Java.util 包中.该类提供了一系列方法来操作数组,如排序.复制.比较.填充等,用户直接调用这些方法即可,不需要自己编码实 ...

  8. 实现JNI的另一种方法:使用RegisterNatives方法传递和使用Java自定义类 (转)

    原帖地址:http://blog.csdn.net/qiuxiaolong007/article/details/7860610 除了使用传统方法实现JNI外,也可以使用RegisterNatives ...

  9. 自学C++之自定义数据类型与自定义类之数组使用4例

     2014年05月26日→星座:双子座 二〇一四年四月廿八 甲午[马],己巳月,丁酉日,戊申时 今属:火:五行:木火土金:缺:水. 纳音五行:沙中金. 药王菩萨圣诞纪念日 都是百度知道的答复. 之 ...

  10. java实现报表_修改带 JAVA 自定义类的报表还要重启应用,咋解决?

    这是 JAVA 编译型语言特性决定的,修改 JAVA 程序重启应用也正常.只不过改报表就要重启整个应用就有点夸张了,报表变动比较频繁,每次都重启应用会影响业务的. 这个问题的根本原因是耦合性问题,报表 ...

最新文章

  1. 《中国式方案秘籍(上部)》
  2. 华为推CPU Turbo,荣耀Note10突破3000档
  3. acwing1086||HDU4507数位dp[恨7不成妻]
  4. 《自然》发布最新科研指数:中美差距缩小,中科院居全球机构首位
  5. “另一个程序正在使用此文件,进程无法访问”的解决方法
  6. iOS ffmpeg 之编译ffmpeg
  7. 企业实战(Jenkins+GitLab+SonarQube)_12_Jenkins+soanr服务器搭建和代码检查
  8. 面试题:InnoDB 中一棵 B+ 树能存多少行数据?【面试不翻车,翻车就跑路】
  9. java Web程序使用wro4j合并、压缩js、css等静态资源
  10. 【大数据部落】基于ARIMA、SVM、随机森林销售的时间序列预测
  11. linux编辑复制多行命令,linux下文本编辑器vim的使用,复制-粘贴-替换-行号-撤销-多文件操作...
  12. 《Smynes游戏模拟器官方版》
  13. 百度EasyDL图像分类的使用
  14. Region Proposal Network
  15. 新型冠状病毒数据可视化分析
  16. python链家二手房_python采集链家二手房信息
  17. Android系统开发
  18. EDK II工程文档官方网址
  19. 目标规划之问题数学化(建模)
  20. 晶振电路的PCB设计

热门文章

  1. python文件写入乱码_python2写入文件乱码怎么解决?
  2. springboot整合J2cache简单使用
  3. 对抗神经网络学习和实现(GAN)
  4. win7系统下文件夹重命名提示找不到该项目:的解决!
  5. Vue加载组件、动态加载组件的几种方式
  6. 杭州优科豪马轮胎有限公司北京经销商
  7. 【UAV】串级 PID 控制原理及应用
  8. 无法定位程序输入点于动态链接库怎么办
  9. 远程工具securtCRT配置
  10. 读书笔记——《灰度决策:如何处理复杂、棘手、高风险的难题》