Java基本类型永远不为null,包装类可为null;基本类型有默认值且不可空,包装类是引用类型,拆箱时null会触发NPE。

Java 基本类型(如 int、boolean、double 等)**永远不能为 null**;而对应的包装类(如 Integer、Boolean、Double 等)**可以为 null**,因为它们是引用类型。
基本类型天生不可为空
基本类型直接存储值,分配在栈上(或作为对象字段在堆上),JVM 强制要求它们必须有确定的默认值:
-
int默认是0 -
boolean默认是false -
char默认是'\u0000' -
double默认是0.0
所以你写 int x = null; 会编译报错 —— 这不是“空指针”,而是语法非法。
包装类本质是对象,可为 null
包装类(Integer、Boolean 等)是 final 类,继承自 Object,属于引用类型。它们像其他对象一样,变量可以指向 null:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
Integer a = null; // ✅ 合法 Boolean flag = null; // ✅ 合法
但要注意:一旦用到自动拆箱(比如 a + 1 或 flag.equals(true)),而此时值为 null,就会抛出 NullPointerException。
判断是否可能为 null 的实用建议
- 看变量声明类型:如果是
int、long等小写类型 → 绝对不为null - 如果是
Integer、Long等大写类名 → 可能为null,使用前建议判空(尤其来自 JSON 解析、数据库映射、方法返回值时) - 用
Objects.nonNull(x)或x != null判断包装类是否为空;基本类型无需也不支持该操作 - 慎用自动装箱/拆箱:比如
Integer a = getFromDB(); int b = a;,若a == null,运行时报 NPE
常见易错场景
以下代码看似合理,实则危险:
public Integer findAge() { return null; }
int age = findAge(); // 编译通过,但运行时抛 NPE!
正确做法是先判空:
Integer ageObj = findAge(); int age = (ageObj != null) ? ageObj : -1; // 提供默认值
或者用 JDK 8+ 的 Optional 更清晰地表达“可能无值”的语义。

















