浅谈Java中空指针异常-java.lang.NullPointerException出现的几种原因及解决方案

2023年4月10日09:08:48

说到空指针异常,你就得先了解什么是空?什么是指针?

浅谈Java中空指针异常-java.lang.NullPointerException出现的几种原因及解决方案

什么是空?

  举个例子:小红过生日,小明送给了小红送一个“礼物”,这个“礼物”只有一个外面的包装,而里面什么都没有,这个礼物就是"",而空则是小明压根没有给小红准备礼物,这个就是null。

什么是指针?

  指针:指针存放的是内存地址。

所以:当指针不指向任何内存地址时,就叫做空指针,但是你偏偏在这时还调用了它,则会抛出空指针异常(java.lang.NullPointerException

例如:

int[] array = null; 
System.out.println(array[0]);

  这个时候原本array数组是个空指针,没有创建新的对象,在调用这个数组的时候就会产生空指针异常的错误!程序运行会显示java.lang.NullPointerException的异常提示。

为什么会产生空指针异常呢?

  这里我们用上面举的例子进行说明,int[] array = null 在内存中的栈内存中开辟了一个的存储空间叫做 array,而堆内存中并没有开辟int类型的数组空间,所以在栈内存中的 array 中没有存放任何内存地址,由此我们可以理解为什么会产生空指针异常,调用没有的东西显然是不可以的。

  大白话总结:空指针异常无非是因为对象为null的情况下去调用该对象所拥有的方法或者成员变量造成的。

实际上空指针异常,也就是你用了一个没有实际值的对象,以下场景最常见:

  • 某一对象没有被实例化,就拿来使用,即调用此对象的方法,会抛空指针异常;如:
//错误写法1
Map map = null;
map.put("姓名", "张三");//会报java.lang.NullPointerException

//正确写法1
Map map = new LinkedHashMap();
map.put("姓名", "张三");

//错误写法2
List lt = null;
lt.add("哈哈哈");

//正确写法2
List lt = new ArrayList();
lt.add("哈哈哈");
  • 获取从别的对象传过来的对象为空,如:String str=null;
  • 数据库查询方面的空指针异常,如:数据库中储存的值为null或不存在;
  • 结果集是空的,或者未初始化就被调用了。

常见避免方案

  • 类型转换-优先使用String.valueOf(XXX)方法代替XXX.toString()

  当程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出,使用静态String.valueOf方法,该方法不会抛出任何异常并打印”null”.

  • 类初始化-优先使用实例化代替默认null

  class被声明了类型, 默认 class = null; 这样在调用class中方法的时候系统只能给你个空指针异常, 给其实例化就好了:class = new Class();如:List lt = new ArrayList();

  • 方法的返回值不要定义成为一般的类型,而是用数组。

  这样如果想要返回null的时候,就返回一个没有元素的数组,能避免许多不必要的NullPointerException。

  总之,NullPointerException是由RuntimeException派生出来的,是一个运行时异常,其意指可能会在运行的时候才会被抛出,一个变量是null,,即只有其名,没有实值内容,也没分配内存。当你要去取他的长度,对他进行操作就会出现NullPointException,所以声明变量时最好给它分配好内存空间,给予赋值。

  例如拿该变量与一个值比较时,要么先做好该异常的处理,要么给它进行判断,如:

if (str != null) {

}

  判断一个String的实例a是否等于“b”时,不要写成a.equals(“b”),这样容易抛NullPointerException,而写成”b”.equals(a)就可以避免这个问题,不过对变量先进行判空后再进行操作更好。

  • 作者:程序yang
  • 原文链接:https://coderyang.blog.csdn.net/article/details/127108268
    更新时间:2023年4月10日09:08:48 ,共 1651 字。