什么是空指针,还有如何有效的避免空指针?

指针就是存储变量的内存地址(在Java里是没有指针的,这里说的”Java指针“指的是“Java的引用”)。
NullPointerException:Java里的空指针即是空引用,是我们 Java 开发人员经常遇到的一个基本异常。

在C语言里面,NULL表示该指针不指向任何内存单元,因此虚拟机无法读取它的值,最终导致NullPointerException。
在JAVA 里面,NULL表示该引用不指向任何对象(即空引用:没有实际内容,也没有分配内存地址)。当通过空引用来调用它的方法或变量就会出现NullPointerException空指针异常。

发生NullPointerException的情况:

1.调用 null 对象的实例方法时。
2.访问或修改 null 对象的字段时。
3.如果一个数组为null,试图用属性length获得其长度时。
4.如果一个数组为null,试图访问或修改其中某个元素时。
5.在需要抛出一个异常对象,而该对象为 null 时。

NullPointerException属于运行时异常 RuntimeException 的子类,是非捕获型的,只有在程序运行时才发生,会造成程序中断。

如何避免空指针?

1.字符串比较,将常量放在前面。
   如: if(name.equals("ROSE"))  当name为null时会造成空指针异常,将常量放在前面 if("ROSE".equals(name))就能避免空指针异常。

2.初始化默认值。
   在引用对象初始化的时候给它默认值或者默认构造实现,如:User u = new User(); u.getName(); 

3.返回空集合。
   集合返回值默认是null,统一规范返回一个空集合,避免空指针异常发生而影响业务,如:return list == null ? new ArrayList():list;

4.断言
   Java自带的断言关键字:assertname == null :"用户姓名为空";
   Java默认是不启动断言检查的,若要启动断言检查则还要设定JVM参数: -enableassertions 才能生效,所以很少直接使用。

   建议使用Spring中的断言:Assert.notNull(name,"用户姓名为空");

5.Optional 是JDK8 提供的新特性,一个可以包含null值的容器对象,可以用来替代 name != null 的判断。   

空指针null与空串的区别:

1. null不占用空间,空字符串占用一定内存空间。
2. null可以赋值给任何对象,而空字条串只能赋值给String。
3. 调用null的方法会返回RuntimeException,调用空字符串的方法不会报错。
4. null自身就是个对象,但它是一个不确定的对象,只能给引用型变量赋值,不能给基本类型赋值。