Java null
[TOC]
引言
对于 Java 程序员来说,空指针一直是恼人的问题,我们在开发中经常会受到 NullPointerException 的蹂躏和壁咚。Java 的发明者也承认这是一个巨大的设计错误。
那么关于 null,我们应该知道下面这几件事情来有效地了解 null,从而避免很多由 null 引起的错误。
大小写敏感
null 是任何引用类型的初始值
null 既不是对象也不是类型,它是一种特殊的值,你可以将它赋值给任何引用类型
null 不能赋值给基本数据类型
将 null 赋给包装类,自动拆箱会报 NPE
带有 null 的引用类型变量,instanceof 会报 false
静态变量为 null 时,调用静态方法不会抛出 NPE
使用 null 值安全的方法
使用 == 或 != 判断 null
大小写敏感
首先,null 是 Java 中的关键字,像是 public、static、final 等。它是大小写敏感的,你不能将 null 写成 Null 或 NULL,这样编辑器将不能识别它们然后报错。
不过这个问题已经几乎不会出现,因为 eclipse 和 Idea 已经给出了编辑器提示。
null 是任何引用类型的初始值
null 是所有引用类型的默认值,Java 中的任何引用变量都将 null 作为默认值,也就是说所有 Object 类下的引用类型默认值都是 null。这对所有的引用变量都适用。
就像是基本类型的默认值一样,例如 int 的默认值是 0,boolean 的默认值是 false 。
null 只是一种特殊的值
null 既不是对象也不是类型,它是一种特殊的值,你可以将它赋值给任何引用类型。
public static void main(String[] args){ String str = null; Integer itr = null; Double dou = null; Integer integer = (Integer) null; String string = (String) null; Systemout.printlnC"integer=" + integer); System.out.printlnc"string=" + string); }
你可以看到在编译期和运行期内,将 null 转换成任何的引用类型都是可行的,并且不会抛出空指针异常。
null 只能赋值给引用变量,不能赋值给基本类型变量。
持有 null 的包装类在进行自动拆箱的时候,不能完成转换,会抛出空指针异常,并且 null 也不能和基本数据类型进行对比:
public static void main(String[] args){ int i = 0; Integer itr = null; System.out.println(itr == i); }
**使用了带有 null 值的引用类型变量,instanceof 操作会返回 false 😗*
public static void main(String[] args){ Integer isNull = null; // instanceof = isInstance 方法 if(isNull instanceof Integer){ System.out.println("isNull is instanceof Integer"); }else{ System.out.println("isNull is not instanceof Integer"); } }
这是 instanceof 操作符一个很重要的特性,使得对类型强制转换检查很有用。
静态变量为 null 时,调用静态方法不会抛出 NullPointerException,因为静态方法使用了静态绑定。
使用 Null-Safe 方法
你应该使用 null-safe 安全的方法,java 类库中有很多工具类都提供了静态方法,例如基本数据类型的包装类如 Integer,Double 等。
public class NullSafeMethod { private static String number; public static void maincstring args){ String s = String.valueOf(number); String string = number.toString(); System.out.println("s=" + s); System.out.println("string=" + string); } }
number 没有赋值,所以默认为 null,使用 String.value(number) 静态方法没有抛出空指针异常,但是使用 toString() 却抛出了空指针异常。所以尽量使用对象的静态方法。
null 判断
你可以使用 == 或者 != 操作来比较 null 值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。
跟 SQL 不一样,在 Java 中 null ==null 将返回 true,如下所示:
public class CompareNull { private static string str1; private static string str2; public static void main(String[] args){ System.out.println("str1 == str2?" + str1==str2); System.out.println(null == null); } }
- java 空指针异常(java.lang.NullPointerException)
- xfire java调用 .NET webservice 方法返回值是[#document: null]
- java.lang.IllegalArgumentException: input == null!
- JAVA中isEmpty和null以及""的区别
- An internal error occurred during:"Update Installed JREs".java.lang.NullPointerException
- 一般报java.lang.NullPointerException的原因有以下几种:
- 如何在Java代码中去掉烦人的“!=null”
- Error:java.lang.NullPointerException: null value in entry: destinationDir=null
- 解决webservice(Java)中dao层注入为null问题
- 避免Java应用中NullPointerException的技巧和最佳实践
- Java转kotlin错误:non-null
- java中的null
- java笔记之null与isEmpty()
- Java中函数重载和null参数的传递
- at org.apache.jsp.index_jsp._jspInit(index_jsp.java:66) 初始化JSP页面时报NULL指针异常
- Unable to start activity : java .lang.nullPointException
- java.lang.NumberFormatException: null
- Java数据类型Null判断
- Java启动子进程,子进程又启动孙进程后,Java在InputStream inputStream = process.getInputStream();中读取时,何时会返回null?
- spring data jpa boot thymeleaf hibernate manytoone 双向关联 java.lang.StackOverflowError: null