Java 测者的测试技术手册:Java 中的 null “类型” 是测试不可超越的鸿沟

CrissChan · 2018年12月26日 · 最后由 CrissChan 回复于 2019年01月03日 · 2000 次阅读

Java 中的 null 类型

null 是一个非常非常特殊的 “类型”,对于每一个测试人员都要十分小心 null 的存在的可能性。同时 null 也让很多 RD 头疼,甚至连 Java 的设计者都成人 null 是一个设计失误。这篇文章,测者想聊聊这个让很多人不喜欢的 null。

null 到底是怎样的存在

在 Java 中有基本类型和引用类型,但是 null 却不属于上述两种,我们即不能声明一个变量为 null 类型,也不能将变量转换为 null。null 的引用是唯一一种 null 正确的表达方式。但是 null 却可以转换成任何一种引用类型。

public class MrTesterTestClass{

Integer int1 = null;
String str1 = null;
Integer int2 = (Integer) null;
String str2 = (String) null;

}

上面的代码在编译其中并不会报错。但是如果我们使用:

int int3 = null

那么就出出现问题。

null 的一些细节注意点

null 的装箱拆箱的细节

先说一个 Java 的概念:装箱和拆箱

Integer count =100;装箱

int sum =count;拆箱

上面的代码清洗的解释了装箱和拆箱的过程,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。

但是如果任何一个包装器类型在拆箱的时候都会包 NPE 异常(空指针异常)。

布尔运算

null 很特别,但是可以而且仅可以做布尔运算。

null==null 的结果是 true,但是这里面特别注意:如果是两个 null 的引用变量那么首先要保证两个引入变量的类型完全一致。运算结果才会是 true。

String 类型转换

public static void main(String[] args){

String str = null;

str= str+"ss";

System.out.println(str);
}

上面的代码的输出:nulss。String 转换后的 null 可以进行字符串运算,这是因为字符串进行连接的时候,编译器对 null 进行了特别的优化。

null 不等于 “”

null 和 “” 不相等,这是因为 “” 会在内容中有一个

关注测者,关注测试

最佳回复

String 和 Object 处理,请选择 spring 和 apache-common-lang、apache-common-utils 这几个工具类
自己写判断即恶心费劲又不讨巧,理解稍微虚浮一点就要被坑,人家封装好的东西还是蛮不错的
StringUtils.isEmpty、StringUtils.isNotEmpty 等等,好用

共收到 5 条回复 时间 点赞

String 和 Object 处理,请选择 spring 和 apache-common-lang、apache-common-utils 这几个工具类
自己写判断即恶心费劲又不讨巧,理解稍微虚浮一点就要被坑,人家封装好的东西还是蛮不错的
StringUtils.isEmpty、StringUtils.isNotEmpty 等等,好用

null 不是类型

SinDynasty 回复

看个人理解,这里说类型是为了和后续描述容易其实标题的类型应该加入双引号

CrissChan 回复

这不是理不理解的问题,null 本来就不是类型
在一个内存堆初始化的时候,底层首先会给他 2 个东西,一个是同步块索引,一个是指针,而指针为空指针时就是 null,在这里已经是运行期的事了,而类型只是存在于编译 - 语义分析阶段,所以从本质上 null 和类型根本就是 2 个互不相干的东西

SinDynasty 回复

https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.1;一起学习,也许是我理解错了。 a special null type, 不是一个 type。你说的是有道理的。官方文档这部分描述也是为了比较容易说清楚内容,并不是为了说明 null 就是一个 type

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册