java 中 switch 匹配 null 会抛出 java.lang.nullpointerexception。这是因为 switch 语句在底层依赖于被匹配对象的 hashcode() 方法,而调用空对象的方法必然导致异常。

switch 对基本类型和包装类型的处理差异
当 switch 的表达式是基本类型(如 int)时,编译器会直接报错,因为基本类型不能为 null。只有当使用包装类(如 Integer)或 String 等引用类型时,才存在匹配 null 的可能性。

public class SwitchNullTest {
public static void main(String[] args) {
Integer num = null;
try {
switch (num) {
case 1:
System.out.println("One");
break;
default:
System.out.println("Default");
}
} catch (NullPointerException e) {
System.out.println("Caught NPE");
}
}
}
运行上述代码,输出结果为:Caught NPE。这证实了即使有 default 分支,null 值依然会触发异常。
立即学习“Java免费学习笔记(深入)”;
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
switch 对 String 类型的 null 处理
从 Java 7 开始,switch 支持 String 类型。如果传入的 String 变量为 null,同样会抛出 NullPointerException。这是因为 String 的 hashCode() 方法在内部会被调用。

public class SwitchStringNullTest {
public static void main(String[] args) {
String str = null;
try {
switch (str) {
case "hello":
System.out.println("Hello");
break;
default:
System.out.println("Default");
}
} catch (NullPointerException e) {
System.out.println("Caught NPE");
}
}
}
运行上述代码,输出结果同样为:Caught NPE。这表明对于 String 类型,null 值的处理方式与包装类一致。
如何安全地处理 switch 中的 null 值
为了避免 NullPointerException,可以在 switch 之前显式检查 null。或者使用 Optional 类来封装可能为 null 的值,从而避免直接传入 null。
public class SafeSwitchTest {
public static void main(String[] args) {
Integer num = null;
if (num == null) {
System.out.println("Null value handled");
} else {
switch (num) {
case 1:
System.out.println("One");
break;
default:
System.out.println("Default");
}
}
}
}
运行上述代码,输出结果为:Null value handled。这是一种安全的处理方式,避免了异常的发生。

















