ZxdNoob
首页文章简历版本历史AI 向导

ZxdNoob

用心记录,认真生活

按 ⌘K 快速导航到任意页面按 ⌘I 打开 AI 向导(或访问 /agent)

导航

  • 首页
  • 简历
  • 版本历史
  • AI 向导

更多

  • GitHub
  • Sitemap

© 2026 ZxdNoob. All rights reserved.

Built with Next.js · Styled with Tailwind CSS

返回文章列表
2026年5月2日 00:18:002 分钟阅读

Java 基础 03:异常体系、try-with-resources、IO/NIO.2 入门与并发初探

初级收尾篇:受检/非受检异常取舍、异常链与日志;现代 IO 用法;线程与 synchronized 的最小正确用法,为进阶 JUC 铺路。

  • Java
  • 异常
  • IO
  • 并发
AI 共读让 Noob 帮你提炼要点 / 答疑

本篇目标:你能用异常表达失败并保留链;用 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.linesStream<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#

  1. 递归统计目录下 .java 文件非空行数(跳过 //、/* */ 可简化)。
  2. 用固定 4 线程池并行计算多个文件的 SHA-256 十六进制字符串,汇总到 Map<Path,String>。

6. 自测清单#

  1. 受检 vs 非受检各自一例。
  2. try-with-resources 与单次 finally close 的差异(suppressed)。
  3. 为何线程池必须关闭?不关闭会怎样?
  4. volatile 能否替代 synchronized 做 counter?

基础篇结束。进阶篇从 JMM 与 JUC 开始。

相关阅读

基于内容相似度 + 标签/系列加权

  • 2026年5月2日 00:24:002 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
    01

    Java 进阶 01:JUC、线程池、CompletableFuture 与异步组合实战

    写给高级工程师:happens-before 直觉、Lock 与原子类、ExecutorService 参数含义、超时/取消/组合异步;常见踩坑与背压入门。

    • Java
    • 并发
    • JUC
  • 2026年5月2日 00:12:002 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
    02

    Java 基础 02:面向对象、集合框架与泛型(正确用上接口与算法复杂度)

    初级必读:类/接口/抽象的分工、equals 与 hashCode 契约、List/Set/Map 选型、迭代与并发修改;泛型如何避免强制转换地狱。

    • Java
    • 集合
    • 泛型
  • 2026年5月2日 00:06:002 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
    03

    Java 基础 01:平台、JDK、字节码与可维护的最小项目骨架

    写给初级工程师:JVM/JRE/JDK 分工、源码到字节码的路径、classpath 与模块的基础心智;用 Maven 或 Gradle 搭一个最小可测试骨架。

    • Java
    • JVM
    • 基础
  • 2026年5月2日 00:00:002 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
    04

    Java 路线 00:从初级到专家的三层能力模型、学习顺序与全系列索引

    面向初级、高级与资深/专家 Java 工程师的分层路线:每层该学什么、如何验收、与本系列各篇的对应关系;附统一练习模板与进阶节奏。

    • Java
    • 学习路线
    • 方法论
返回文章列表

目录

9
  1. 1. 知识点:异常层次
  2. 2. 知识点:`try-with-resources`
  3. 3. 知识点:NIO.2 常用 API
  4. 4. 知识点:并发入门
  5. 4.1 `synchronized` 保护共享可变状态
  6. 4.2 `volatile`
  7. 4.3 `ExecutorService`
  8. 5. Lab
  9. 6. 自测清单
进入沉浸式阅读