局部变量必须显式初始化,编译器检查所有执行路径;成员变量不应依赖默认值;static final 常量需声明时赋值;final 变量须一次且仅一次赋值;资源释放优先用 try-with-resources。

局部变量必须显式初始化
方法内定义的变量没有默认值,编译器会检查所有执行路径。只要存在某条路径没赋值就访问,直接报错。
错误写法:
int x;
if (valid) x = 10;
System.out.println(x); // 编译失败
推荐写法:
int x = valid ? 10 : -1; 或 int x = 0;
赋予业务可解释的初始值,比单纯填0或null更清晰。
避免“先声明、后赋值、再使用”三步分离——嵌套条件多时极易遗漏。
成员变量别依赖默认值
虽然 int 默认是 0、boolean 是 false、引用类型是 null,但这只是 JVM 的安全兜底,不是设计意图。
危险示例:
private List
后续调用 items.add("a") 直接触发 NullPointerException。
稳妥做法:
private List
或统一在构造器中初始化:public MyClass() { this.items = new ArrayList(); }
静态常量应声明为 public static final 并在声明处赋值:public static final String API_VERSION = "v3";
final 变量必须一次且仅一次赋值
final 不是语法装饰,而是语义承诺:不可变、线程安全、意图明确。
局部 final:
• 声明后必须在使用前完成赋值
• 不可重复赋值,也不允许分支遗漏(如只有 if 没有 else 就会编译失败)
成员 final:
• 可在声明处、构造器内、或实例初始化块中初始化
• 三者只能选其一,且每个构造器都必须确保它被赋值
static final 字段务必在声明时直接初始化,避免静态块中延迟赋值带来的不确定性。
资源释放优先用 try-with-resources
Java 7 引入、Java 9 进一步优化的自动资源管理机制,是释放流、连接、扫描器等有限资源的首选方式。
关键前提:资源类必须实现 AutoCloseable 接口(如 FileInputStream、Connection、Scanner 等)。
Java 9 增强写法(推荐):
InputStream is = new FileInputStream("data.txt");<br>
try (is) { /* 使用 is */ }
只要 is 是 effectively final(未被重新赋值),就能直接引用,无需重复声明。
传统手动释放易出错:
• 变量作用域限制导致 finally 中无法访问 try 内声明的流
• 忘记判空或关闭异常被吞,资源实际未释放
实战建议:
• 多资源按使用顺序声明,JVM 自动逆序关闭
• 自定义资源类务必实现 AutoCloseable,并在 close() 中释放底层句柄
• 避免在 close() 中抛出新异常掩盖原始异常(可用 addSuppressed 处理)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











