你对null真的了解吗??浅谈一下java中的null

目录

概述

数据类型选取

null是什么

类型

使用注意点

与空字符串的区别

类型:

内存分配:


概述

说起null大家肯定不陌生,就是指针没有指向任何地址的一个变量,就是这么熟悉的东西,往往是我们疏忽大意,薄弱的地方。

今天的项目中就遇到一个问题,给int基本类型赋值,这是传入的是null就报了NPE问题,,,哎查了好久才分析出来。

 文中划红线的地方报的NPE?? positionInfo是new的肯定不会报空指针问题。

contractPosDto上面也用了。???what怎摸上面没报错,,后来经过检查是x变量声明都是int基本类型,这时在给int基本类型赋值的时候就报NPE了。问题原因就找到了。

那么有些读者会问,到底是用基本类型还是包装类型呢??下面说一下基本类型和包装类型的选取问题。

数据类型选取

主要是看是否需要null,需要就只能包装类型,不需要就基本类型
curd应用,接受参数,数据库返回,最好用包装类型,一定程度上避免因为不能转换成null导致的问题。

其实这方面的转换也不会耗费太大的性能问题,记得阿里的开发手册上就是推荐使用包装类型(应该是,如果不是请大家指正)

null是什么

接下来步入正题,讲一讲null的前世今生。

说起null所有🐒都不陌生,从最早的c语言就经常听到空指针问题,,那么纠结什么是空指针呢?

我们的程序是运行在内存当中的,每一个内存都有一个地址,就像我们平时住旅馆时的房间号一样。每一个房间都有一个房间号。我们能够根据房间号找到对应的房间。但是如果给了我们一个空的门牌号,再让我们根据这个什么都没有的门牌号找人的话,肯定是一脸懵逼,同样电脑也一样,不会凭空进行查找。

简单点说,一个指针不指向任何数据,我们就称之为空指针。

类型

  • null即不是对象也不是一种类型。它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,例如:
Integer i=null;
Float f=null;
String s=null;

但是不能把null赋值给基本类型,如int ,float,double等

int k=null ----------编译器会报错cannot convert from null to int

就像每种原始类型都有默认值一样,int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。就像你创建了一个布尔类型的变量,它将false作为自己的默认值,java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你)。

可以看到idea并没有报错,可以正常编译。在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。

  • null是关键字

像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,否则编译器会报错

使用注意点

  • 包含null值的包装类在java拆箱生成基本类型时会抛出一个NPE

直接将null赋值给基本类型会出现编译错误。但将null赋值给包装类object,然后将object赋给各自的基本类型,编译不会报错,但运行会空指针,这是自动拆箱导致的。

例如:

Integer i=null;
int k=i;
--------抛出java.lang.NullPointerException

 这段代码看起来非常简单并且没有错误。

你所做的一切是找到一个数字在数组中出现了多少次, 这是Java数组中典型的寻找重复的技术。开发者首先得到以前的数值,然后再加一,最后把值放回Map里。程序员可能会以为,调用put方法时,自动装箱会自己处理好将int装箱成Interger,但是他忘记了当一个数字没有计数值的时候,HashMap的get()方法将会返回null,而不是0,因为Integer的默认值是null而不是0。

当把null值传递给一个int型变量的时候自动装箱将会返回空指针异常。设想一下,如果这段代码在一个if嵌套里,没有在测试环境下运行,但是你一旦放在生产环境里,BOOM:-),是不是美兹兹。


  • 如果使用了带有null值的引用类型的变量,instance of操作会返回false

这是instanceof操作一个很重要的特性,使得对强制类型转换检查很有用

  • 可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态类型绑定,不会抛空指针异常

  • 再遍历集合或数组的时候,需要添加null判断,不然集合或者数组中包含null时,会抛出异常
  • 使用equals判断字符串是否相等时,要将常量字符串放在equals左边,防止NPE
例如:

String[] arr1={"abc","123",null,"sky"};
for (String s1 : arr1) {
boolean flag=s1.equals("sky");
}
------------当取值到是=null时,会抛出空指针异常,把s1.equals("sky")改为“sky”.equals(s1),就可以避免抛出异常
  •  可以将null传递给方法使用,这时方法可以接收任何引用类型,如 public void print(Object obj) 可以这样调用print(null).编译可以通过,但结果就取决去你的方法了。这个例子中的print方法,不会抛出空指针异常,只是退出,业务逻辑允许的话,推荐使用null安全的方法。
  • 可以使用== 或者 != 操作来比较null值,但是不能使用其他算法或者逻辑操作,如大于、小于。与SQL不同,java中的null==null会返回true

与空字符串的区别

类型:

null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;

""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = "" ;

内存分配:

String str = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;

String str = ""; 表示声明一个字符串类型的引用,其值为""空字符串,这个str引用指向的是空字符串的内存空间;

在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap):

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智达教育‍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值