Java小白踩坑录 - Java有关null的几件小事

简介: Java小白踩坑录 - Java有关null的几件小事

Java 中的 null 看着很简单,也容易被很多人忽略,有时候也让人不知所措。

Java 中的空 null

我们先看几段代码吧。

1. 例一:null 的对象性

public class NullTest {
 public static void greet() {
  System.out.println("Hello world!");
 }
 public static void main(String[] args) {
  ((NullTest) null).greet();
 }
}

上面的程序看起来似乎应该抛出 NullPointerExceptioin 异常,因为其 main 方法是在常量 null 上调用 greet 方法,而你是不可以在 null 上调用方法的,对吗?

其实编译和运行都没有问题。运行结果为:

Hello world!

2. 例二:null 的初始化

public static void main(String[] args) {
 String str=null;
 Integer in=null;
 Double dou=null;
 String str1=(String)null;
 Integer in1=(Integer)null;
 Double dou1=(Double)null;
 int in2=null;
 int in3=(int)null;
}

image.png

发现 null 可以初始化引用类型,也可以转换为任意的引用类型。但不能给基本类型赋值,或者转换为基本类型。

3. 例三:null 的相等性

public static void main(String[] args) {
  System.out.println(null==null);
  System.out.println(null!=null); 
  System.out.println(Double.NaN==Double.NaN);
  System.out.println(Double.NaN!=Double.NaN);
}

结果该是什么呢?

true
false
false
true

4. 例四:null 不是引用类型

public static void main(String[] args) {
  Integer in=null;
  if(in instanceof Integer) {
    System.out.println("null is integer");
  }else {
    System.out.println("null is not integer");
  }
}

结果是:

null is not integer

5. 例 5:不可传递

1. public static void main(String[] args) {
2.  Integer i=null;
3. int k=i;
4.  System.out.println(k);
5. }

报错:

1. Exception in thread "main" java.lang.NullPointerException
2. NullTest.main(NullTest.java:6)

6. 例 6:null 的数组

public static void main(String[] args) {
 String[] arr1={"abc","123",null,"sky"};
 boolean flag=false;
 for (String s1 : arr1) {
  if(s1.equals("sky")) {
    flag=true;
    break;
  }
 }
 System.out.println(flag);
}

运行时报错

1. Exception in thread "main" java.lang.NullPointerException
2. at NullTest.main(NullTest.java:8)

修改成

public static void main(String[] args) {
 String[] arr1={"abc","123",null,"sky"};
 boolean flag=false;
 for (String s1 : arr1) {
  if("sky".equals(s1)) {//对比前后顺序
    flag=true;
    break;
  }
 }
 System.out.println(flag);
}

就没有问题了。

追根到底

JSL 3.10.7 定义了null

The null type has one value, the null reference, represented by the null literal null, which is formed from ASCII characters.

JSL 4.1 做了补充:

1.There is also a special null type, the type of the expression null (§3.10.7, §15.8.1), which has no name.

Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.

注:null 是一种特殊类型,它的表达式为 null,但没有名称。因为 null 类型没有名称,故不能声明一个 null 类型(如 private null a),也不能将一个类型转为 null 类型。

2.The null reference is the only possible value of an expression of null type.

注:使用 null 类型的唯一方式是使用 null 引用(如 private Integer a = null);

3.The null reference can always be assigned or cast to any reference type (§5.2, §5.3, §5.5).

注:空引用可以赋值给其他任意类型,如 String,Integer,Class 等等。

4.In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.

注:其实,程序开发者可以忽略 null 类型,仅仅将它当作一种可以赋值给其他任意类型的特殊引用。

目录
相关文章
|
12月前
|
JSON 前端开发 Java
【Bug合集】——Java大小写引起传参失败,获取值为null的解决方案
类中成员变量命名问题引起传送json字符串,但是变量为null的情况做出解释,@Data注解(Spring自动生成的get和set方法)和@JsonProperty
|
IDE Java 测试技术
如何优雅地根治Java中Null值引起的Bug问题
【8月更文挑战第18天】在Java开发中,null 值是一个既常见又危险的存在。它常常是导致程序崩溃、难以调试的“罪魁祸首”。然而,通过一系列优雅的策略和实践,我们可以有效地减少甚至根除由 null 值引发的Bug。本文将从多个方面探讨如何做到这一点。
257 4
|
Java 测试技术
Java系列之判断字符串是为空或者null
这篇文章介绍了如何在Java中使用`isEmpty()`方法判断字符串是否为空或`null`,并提供了相应的测试用例来演示其用法。
|
存储 JavaScript Java
Java中未被初始化的字符串打印出“null”?
在Java中,未初始化的`String`变量默认值为`null`。打印此类变量时输出“null”,是因为`PrintStream`类中的`print`方法特别处理了`null`值,将其转换为字符串“null”。从JDK 17开始,`println`方法通过`String.valueOf`间接实现相同功能。当拼接包含`null`的字符串时,如`s1 + "BLACK"`,结果为“nullBLACK”,这是因为字符串构建过程中`StringBuilder`的`append`方法将`null`转换为“null”。
244 2
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
196 0
|
Java 数据处理 Apache
探讨Java中判断String类型为空和null的方法
探讨Java中判断String类型为空和null的方法
549 1
|
Java 程序员 开发者
Java之! = null判空
总之,`!= null`的判空技巧对于任何使用Java进行开发的程序员都是基本功,它有助于维护代码的清晰度和安全性,在编写可靠和维护性强的软件应用时扮演着关键角色。掌握这个简单却重要的技术,将对任何Java开发者的职业生涯大有裨益。
238 0
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
661 3
|
安全 算法 Java
Java8实战-用Optional取代null
Java8实战-用Optional取代null
142 0
|
Web App开发 分布式计算 大数据
MaxCompute操作报错合集之配置归并节点,出现java.lang.NullPointerException: null错误提示,该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
282 0