Java编程六大常见错误:①局部变量未初始化即使用;②混淆==与equals()导致字符串比较错误;③循环中直接修改集合引发ConcurrentModificationException;④异常处理不完整,如忽略检查型异常或空catch;⑤循环内用+拼接字符串致性能下降;⑥未区分成员变量默认值隐患。

变量未初始化就使用
Java要求局部变量在使用前必须显式初始化,编译器不会给默认值。比如写 int x; System.out.println(x); 会直接报错“可能尚未初始化”。成员变量(类字段)虽有默认值(如 int 是 0,Object 是 null),但依赖默认值容易掩盖逻辑疏漏,尤其在对象引用上——用 null 调方法会触发 NullPointerException。建议声明时就初始化,或确保所有分支都赋值。
混淆 == 和 equals()
== 比较的是引用是否指向同一内存地址;equals() 才用于判断内容是否相等。字符串比较最典型:用 "abc" == "abc" 可能为 true(字符串常量池优化),但 new String("abc") == new String("abc") 一定是 false。正确做法是统一用 "abc".equals(str)(推荐把字面量放前面,避免 str 为 null 时抛异常)。
循环中修改集合元素导致 ConcurrentModificationException
用 for-each 或迭代器遍历 ArrayList、HashMap 等集合时,若在循环体内调用 remove() 或 add(),几乎必抛此异常。这不是线程问题,而是单线程下 fail-fast 机制的保护。安全做法是:用迭代器的 iterator.remove(),或改用 removeIf()(Java 8+),或先收集待删元素,循环结束后统一处理。
异常处理不完整:忽略检查型异常或吞掉异常
IOException、SQLException 等检查型异常(checked exception)必须捕获或声明抛出,否则编译失败。新手常写空 catch 块:catch (Exception e) {},看似“解决了”,实则掩盖问题,程序静默失败。应至少记录日志(如 logger.error("读文件失败", e)),或根据业务决定重试、转换异常类型、或向上抛出。非检查型异常(如 NullPointerException)虽不强制处理,也不该放任不管。
立即学习“Java免费学习笔记(深入)”;
String 拼接误用 + 在循环中
在 for 循环里写 str += "a",每次都会创建新 String 对象(因 String 不可变),时间复杂度接近 O(n²),大数据量时性能骤降。应改用 StringBuilder(单线程)或 StringBuffer(多线程),先 new StringBuilder(),循环内调用 append(),最后 toString()。Java 9+ 对某些简单拼接做了优化,但逻辑清晰和习惯优先,别依赖编译器猜测意图。










