Z
ZHANK
编程在线教程Java 教程常见错误与调试
实战进阶

常见错误与调试

分析 NPE、ClassCastException、ConcurrentModificationException 等

常见错误与调试

掌握常见的 Java 错误及调试方法,快速定位问题。

学完本章你将: 识别 NPE、ClassCastException 并学会调试。


NullPointerException

java
// ❌ 最常见的错误
String str = null;
// int len = str.length(); // NullPointerException!

// ✅ 防御性编程
if (str != null) {
    int len = str.length();
}

// ✅ 使用 Optional(Java 8+)
Optional<String> opt = Optional.ofNullable(str);
int len = opt.map(String::length).orElse(0);

// ✅ Objects.requireNonNull
String safe = Objects.requireNonNull(str, "str 不能为 null");

ClassCastException

java
// ❌ 类型转换错误
Object obj = "hello";
// Integer n = (Integer) obj; // ClassCastException!

// ✅ 先检查类型
if (obj instanceof Integer n) {
    // 模式匹配(Java 16+)—— 自动转换
    System.out.println(n);
}

ConcurrentModificationException

java
// ❌ 遍历时修改
List<String> list = new ArrayList<>(List.of("A", "B", "C"));
// for (String s : list) {
//     if (s.equals("B")) list.remove(s); // ConcurrentModificationException!
// }

// ✅ 使用 Iterator 删除
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    if (it.next().equals("B")) it.remove();
}

// ✅ 或使用 removeIf
list.removeIf(s -> s.equals("B"));

调试技巧

java
// 1. 打印日志(临时调试)
System.out.println("变量值: " + value);
System.err.println("错误路径");

// 2. 使用 assert
assert value > 0 : "value 必须为正数:" + value;
// 运行时需加 -ea 参数启用断言

// 3. IDE 断点调试
// - 条件断点:只在 i == 100 时停下
// - 表达式求值:Alt+F8 计算任意表达式
// - 步进:F7(进入)/ F8(跳过)/ F9(恢复)

// 4. 打印调用栈
new Exception("调试栈").printStackTrace();