1.什么是NPE,什么情况下会发生NPE
NPE全称叫:NullPointerException,中文意思是:空指针异常。
数组:数组是一连串的内存空间, 拥有多个相同数据类型的内存地址,数组本身也是一种数据类型。
数组由下标/索引(index)和元素(element)组成;数组的作用是利用指针指向在堆区中相对应的地址元素,当指针是null的时候,查询不到开辟的内存空间,因此不允许指针进行操作,系统会出现NPE
例如:定义一个普通类型的数组![](https://img-blog.csdnimg.cn/b98598fec43947839f2d4bec1d7d2643.png)
定义一个对象数组:![](https://img-blog.csdnimg.cn/228930b60e5c40f4ac6564c852ac7f72.png)
集合元素为null![](https://img-blog.csdnimg.cn/e1f178c9c56a4959a35a9a3a6fdd40e4.png)
包装类为null,拆箱报错
对象级联调用
如何防止NPE?
因为NPE出现的关键是指针为null,所以当我们使用指针进行操作的时候,如果不确定指针是否为null,应该对指针做非空判断,判断指针为null时,使用new关键字开辟内存空间,来防止NPE出现
if(指针== null) {指针= new ...}
2.new关键字的作用
简单地说new的作用是在堆区开辟内存空间,并返回该内存空间的内存地址
具体来说:
1. 与栈区分配一个存储空间保存引用(固定的指针)。
2. 与堆区分配一片内存空间保存相应类的对象(引用数据类型的对象,如:数组、对象等)。
可用于在堆区构造数组和对象:构造数组------new 数据类型[长度]
构造对象-------new 构造方法()
3. 将堆区对象的首地址赋予栈区引用。
注意:使用 new 关键字时会调用类中的构造方法,对于有父类的类会首先调用其父类的构造方法。
构造数组的结构示意图:
构造对象的例子:
Student stu;
stu = new Student();
在java中变量保存在栈内存中,对象保存在堆内存中。
在上面的例子,执行语句Student stu;
表示声明一个指向Student类对象的引用stu,这个引用stu保存在栈内存中。
执行语句:
stu = new Student();
1)new Student()表示创建一个Student类的对象,并在堆内存中分配空间;
2)stu = new Student();表示让stu这个引用变量指向这个Student类对象。
3.数组和对象的区别
数组和对象都是可以表示成数据的集合;
1)数组表示有序数据的集合,而对象表示无序数据的集合。
2)数组的数据没有”名称”,但是有对应的索引,比如arr[3];对象的数据有”名称”(属性名),而对象因为是无序数据的集合,所以不存在索引,用类名.属性名来表示。
4.基本数据类型对应的引用数据类型
.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。有如下特点:
1)基本数据类型的值是不可变的(我们不能给基本数据类型添加属性和方法);
2)基本数据类型的比较是值的比较(只有他们的值相等的时候才是相等的);
3)基本数据类型的变量是存放在栈里面的
引用数据类型有三大类:
引用数据类型可以拥有属性和方法,属性又可以包括基本数据类型和引用数据类型。有如下特点:
1)引用数据类型可以拥有属性和方法,且值是可变的;
2)引用数据类型的值是同时保存在栈内存和堆内存的对象
数组中元素的默认值
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
boolean | false |
char | \u0000 |
引用类型1.数组2.类 | null |