null 在 Java 中的作用有点臭名昭著。遇到可怕的 NullPointerException 问题可能是所有 Java 开发人员的必经之路。我们将在本文后面讨论这个问题,但了解 Null 如何在底层工作可以帮助您了解何时使用它以及如何避免问题。
在 Java 中,null 是一个Java字面量,一个特殊的常量,您可以在任何时候希望指向不存在的值时指向该常量。它既不是对象也不是类型,这是 Java 语言新手必须克服的常见误解。
创建 Null 是为了提供一种方法来指出某些东西的缺失。当您在 Java 中声明一个变量时,您必须指定它希望存储在该变量中的类型。您可能会将变量视为存储两种主要类型之一的值的容器:
原语是编程语言提供的预定义数据类型。当您将变量声明为原始类型(例如,int、float)时,您的变量直接包含基础值。
引用是指向所表示的值的指针。当您将变量声明为引用类型时,您存储的是指向值的地址,而不是值本身。类、数组和字符串是引用类型的示例。
原始类型不能有 null 值,但 null 可以分配给任何引用类型。这是一个例子:
//You can assign null to reference types like strings
String myStr = null;
//Similarly you can assign null to the reference type class that points to a primitive type like "int"
Integer a = null;
//But not directly to the primitive type "int"
int myInt = null;
// Will throw the following error: "incompatible types : required int found null"
Null 对象也可以在编译时和运行时转换为任何类型。
// Typecasting null to the Integer Class
Integer objInt = (Integer) null;
//Typecasting null to the Double Class
Double objDbl = (Double) null;
虽然从更广泛的编程意义上理解 null 的概念通常很简单,作为指出没有值的一种方式,但在实践中,我们必须熟悉 null 在任何给定编程语言中的细微差别。
null关键字
Null 是 Java 编程语言中的保留关键字。从技术上讲,它是一个类似于 True 或 False 的对象字面量。
Null 是区分大小写的,就像 Java 中的任何其他关键字一样。
//This will throw a compile-time error
Integer errInt = NULL;
//Returns compile-time error : can't find symbol 'NULL'
Integer Int = null;
//Will assign the integer class Int to a null value
在 Java 中编程时,将 null 写成小写非常重要。Null 和 NULL 都会引发编译时错误。
Null 用作默认值
正如原始类型有默认值(例如,整数为 0,布尔值为 false),null 是引用类型的默认值。Null 用作任何未初始化引用变量的默认值,包括实例变量和静态变量(尽管您仍会收到未初始化局部变量的编译器警告)。考虑以下 Java 代码示例。
public class Main {
// Uninitialized variable of reference type will store null until initialized
private static Object emptyObject;
// Uninitialized integer is a primitive type so it will store a value (e.g., 0)
private static int emptyInt;
public static void main(String[] args) {
// Initialized integer with value 20.
int regInt = 20;
System.out.println(regInt);
// Prints 20
System.out.println(emptyInt);
// Prints 0
System.out.println(emptyObject);
// Prints null
}
}
将 null 与 instanceOf 运算符一起使用
如果您想知道一个对象是否是特定类、子类或接口的实例,您可以使用 instanceOf 运算符进行检查。需要注意的是,如果在任何具有空值或空文字本身的引用变量上使用 instanceOf 运算符,它将返回 false 。
当您指向具有空值的对象时,Java 中会抛出 java.lang.NullPointerException。Java 程序员在忘记初始化变量时通常会遇到这种臭名昭著的指针异常(因为 null 是未初始化引用变量的默认值)。
程序员可能遇到 NullPointerException 的常见场景包括:
调用未初始化的变量
使用空对象访问或修改数据字段或成员
将空对象作为参数传递给方法
使用空对象调用方法
同步一个空对象
抛出一个空对象
将空对象视为 Java 数组
那么如何避免 NullPointerException 呢?简单的。不要返回空值。
除了确保所有变量都正确初始化并且所有对象引用都指向有效值这一显而易见的任务(尽管不一定容易)之外,您还可以使用一些技术来处理 NullPointerException。
检查方法的参数
private static void CheckNull(String myStr) {
if (myStr != null) {
System.out.println(myStr.length());
} else {
// Perform an alternate action when myStr is null
System.out.println “Please pass a valid string as an argument”
}
}
使用三元运算符
//boolean expression ? value1 : value2;
String myStr = (str == null) ? "" : str.substring(0, 20);
//If str’s reference is null, myStr will be empty. Else, the first 20 characters will be retrieved.
返回空集合而不是 null
返回空集合而不是 null 值被认为是最佳实践。
public class emptyString {
private static List<Integer> numbers = null;
public static List<Integer> getList() {
if (numbers == null)
return Collections.emptyList();
else
return numbers;
}
}
通过以上介绍,相信大家对Java中的null已经有所了解,大家如果对此比较感兴趣,想了解更多相关知识,不妨来关注一下动力节点的Java教程,里面的课程内容细致全面,很适合小白学习,希望对大家能够有所帮助。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习