JAVA 常见典型 BUG 及解决方案
NullPointerException
空指针异常是最常见的运行时错误,通常发生在尝试调用或访问 null 对象的方法或属性时。
检查对象是否为 null 后再进行操作:
if (object != null) {
object.method();
}
使用 Java 8 的 Optional 避免空指针:
Optional<String> optional = Optional.ofNullable(str);
optional.ifPresent(System.out::println);
ArrayIndexOutOfBoundsException
数组越界异常通常在访问超出数组长度的索引时发生。
确保索引在有效范围内:
if (index >= 0 && index < array.length) {
int value = array[index];
}
使用增强型 for 循环避免手动索引管理:
for (String item : array) {
System.out.println(item);
}
ConcurrentModificationException
在迭代集合时修改集合会导致此异常,常见于 ArrayList 或 HashMap。
使用迭代器的 remove() 方法而非集合的 remove():
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (condition) {
iterator.remove();
}
}
使用线程安全的集合类如 CopyOnWriteArrayList:
List<String> list = new CopyOnWriteArrayList<>();
ClassCastException
类型转换异常发生在错误的类型强制转换时。
使用 instanceof 检查类型:
if (obj instanceof String) {
String str = (String) obj;
}
尽量使用泛型避免手动类型转换:
List<String> list = new ArrayList<>();
String item = list.get(0);
StackOverflowError
递归调用层数过深会导致栈溢出。
优化递归为循环结构:
while (condition) {
// 替代递归逻辑
}
增加 JVM 栈大小(适用于确实需要深递归的情况):
-Xss2m
OutOfMemoryError
内存不足通常由堆内存耗尽或内存泄漏引起。
调整 JVM 堆内存:
-Xmx1024m -Xms512m
使用内存分析工具(如 VisualVM 或 MAT)检测内存泄漏。
NumberFormatException
字符串转换为数字时格式错误会触发此异常。
使用正则表达式预校验数字格式:
if (str.matches("-?\\d+(\\.\\d+)?")) {
double num = Double.parseDouble(str);
}
捕获异常并提供默认值:
try {
int num = Integer.parseInt(str);
} catch (NumberFormatException e) {
num = 0;
}
IllegalArgumentException
方法参数不合法时抛出,通常由参数验证缺失导致。
在方法入口处校验参数:
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
this.age = age;
}
FileNotFoundException
文件路径错误或权限不足时触发。
检查文件是否存在且可读:
File file = new File(path);
if (file.exists() && file.canRead()) {
// 处理文件
}
捕获异常并提供友好提示:
try {
FileInputStream fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
System.err.println("文件未找到: " + e.getMessage());
}
SQLException
数据库操作错误可能由连接问题、SQL 语法错误或约束冲突引起。
使用 Try-With-Resources 确保资源释放:
try (Connection conn = DriverManager.getConnection(url);
PreparedStatement stmt = conn.prepareStatement(sql)) {
// 执行 SQL
} catch (SQLException e) {
e.printStackTrace();
}
记录详细的 SQL 错误信息:
catch (SQLException e) {
System.err.println("SQL State: " + e.getSQLState());
System.err.println("Error Code: " + e.getErrorCode());
}
总结
通过预检查、异常捕获、工具分析和代码优化,可以显著减少 Java 开发中的典型 BUG。关键点包括:
- 使用
Optional和instanceof增强鲁棒性。 - 避免在迭代中直接修改集合。
- 合理配置 JVM 参数应对内存问题。
- 对输入参数和外部资源进行严格校验。
1263

被折叠的 条评论
为什么被折叠?



