必须显式初始化局部变量;类成员变量应设业务合理初值;final字段需在构造完成前全覆盖赋值;printf格式符须与参数类型严格匹配。

最直接的办法是:所有局部变量声明时必须显式初始化,不能只声明不赋值;类成员变量虽有默认值,但应主动赋予业务上合理的初值。
局部变量必须初始化后才能使用
Java 编译器严格要求局部变量在读取前必须已明确赋值。哪怕逻辑上“一定会被赋值”,只要编译器无法静态确认所有执行路径都覆盖,就会报错“可能未初始化”。
- 错误写法:
int count; System.out.println(count);→ 编译失败 - 正确写法:
int count = 0; System.out.println(count);或在 if/else 所有分支中都赋值 - 若变量依赖条件计算,优先在声明处给一个安全默认值(如 0、false、null),再按需覆盖
成员变量别依赖默认值
虽然 int 默认为 0、String 默认为 null,但这些值往往不符合业务语义,容易引发空指针或逻辑错误。
- 年龄字段写成
private int age;→ 默认 0,但用户年龄不可能为 0 - 推荐写成
private int age = -1;或private Integer age = null;,配合校验逻辑更清晰 - 集合类务必初始化:
private List<string> tags = new ArrayList();</string>,避免调用 size() 时 NPE
final 字段初始化要全覆盖
final 实例变量必须在构造完成前完成赋值,且每个构造器路径都得保证它被设置。
立即学习“Java免费学习笔记(深入)”;
- 不能只在某个 if 分支里赋值,否则 else 分支会触发编译错误
- 可在声明处直接初始化:
private final String id = UUID.randomUUID().toString(); - 或在每个构造器中显式赋值,包括所有重载版本
- 禁止在普通方法里给 final 字段赋值,哪怕该方法只被构造器调用一次
格式化输出时注意类型匹配
用 printf 传参时,变量类型必须与格式符严格对应,否则运行时报错,也容易让人误以为是初始化问题。
-
%d只接受整数类型(int、long),double得用%.2f - 别把
NumberFormat.format()返回的字符串,当成数值传给printf占位符 - 建议统一初始化数值变量为 0.0,并用匹配的格式符,减少类型混淆


















