Java 基础 03:异常体系、try-with-resources、IO/NIO.2 入门与并发初探
初级收尾篇:受检/非受检异常取舍、异常链与日志;现代 IO 用法;线程与 synchronized 的最小正确用法,为进阶 JUC 铺路。
- Java
- 异常
- IO
- 并发
本篇目标:你能用异常表达失败并保留链;用
try-with-resources关闭资源;用Files/Path安全读写文本;用ExecutorService做批量并行并正确shutdown。
1. 知识点:异常层次#
Throwable
├── Error # 严重系统问题,通常不捕获
└── Exception
├── RuntimeException # 非受检:编程错误/不可恢复
└── 其他受检异常 # 调用方必须处理或 throws取舍:业务可恢复 → 受检或 Result 对象;编程错误/断言失败 → 非受检。不要在循环里 catch 后空块。
异常链:
try {
Files.readString(Path.of("x"));
} catch (IOException e) {
throw new IllegalStateException("load config failed", e);
}2. 知识点:try-with-resources#
try (var in = Files.newInputStream(Path.of("data.bin"))) {
// use
}任何 AutoCloseable 适用;禁止在 finally 里重复 close 导致掩盖异常——优先 try-with-resources(支持 suppressed)。
3. 知识点:NIO.2 常用 API#
| API | 说明 |
|---|---|
Paths.get / Path.of | 路径 |
Files.readString / writeString | 小文本 |
Files.lines | Stream<String>,需 try-with-resources |
Files.walk | 遍历树 |
大文件:用 BufferedReader + 行迭代,避免 readAllBytes() OOM。
long lines = 0;
try (var br = Files.newBufferedReader(Path.of("big.log"), StandardCharsets.UTF_8)) {
while (br.readLine() != null) lines++;
}4. 知识点:并发入门#
4.1 synchronized 保护共享可变状态#
class Counter {
private int n;
synchronized void inc() { n++; }
synchronized int get() { return n; }
}n++ 非原子:读-改-写,必须同步或使用 AtomicInteger。
4.2 volatile#
保证可见性,不保证 i++ 复合操作原子性。
4.3 ExecutorService#
import java.util.concurrent.*;
try (ExecutorService pool = Executors.newFixedThreadPool(4)) {
Future<String> f = pool.submit(() -> "ok");
System.out.println(f.get(1, TimeUnit.SECONDS));
}学以致用:批量任务用 invokeAll;关闭时 shutdown + awaitTermination,任务需响应中断。
5. Lab#
- 递归统计目录下
.java文件非空行数(跳过//、/* */可简化)。 - 用固定 4 线程池并行计算多个文件的 SHA-256 十六进制字符串,汇总到
Map<Path,String>。
6. 自测清单#
- 受检 vs 非受检各自一例。
try-with-resources与单次 finally close 的差异(suppressed)。- 为何线程池必须关闭?不关闭会怎样?
volatile能否替代synchronized做 counter?
基础篇结束。进阶篇从 JMM 与 JUC 开始。
相关阅读
基于内容相似度 + 标签/系列加权
- 2 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 进阶 01:JUC、线程池、CompletableFuture 与异步组合实战
写给高级工程师:happens-before 直觉、Lock 与原子类、ExecutorService 参数含义、超时/取消/组合异步;常见踩坑与背压入门。
- Java
- 并发
- JUC
- 2 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 基础 02:面向对象、集合框架与泛型(正确用上接口与算法复杂度)
初级必读:类/接口/抽象的分工、equals 与 hashCode 契约、List/Set/Map 选型、迭代与并发修改;泛型如何避免强制转换地狱。
- Java
- 集合
- 泛型
- 2 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 基础 01:平台、JDK、字节码与可维护的最小项目骨架
写给初级工程师:JVM/JRE/JDK 分工、源码到字节码的路径、classpath 与模块的基础心智;用 Maven 或 Gradle 搭一个最小可测试骨架。
- Java
- JVM
- 基础
- 2 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 路线 00:从初级到专家的三层能力模型、学习顺序与全系列索引
面向初级、高级与资深/专家 Java 工程师的分层路线:每层该学什么、如何验收、与本系列各篇的对应关系;附统一练习模板与进阶节奏。
- Java
- 学习路线
- 方法论