1. 网络异常(如 SocketTimeoutException
)
- 异常描述:当在网络操作中等待响应超过设定的超时时间时抛出。
- 处理方式:在代码中设置合理的重试机制。例如,使用
Apache Commons Retry
库,通过 RetryTemplate
进行重试配置。
RetryTemplate retryTemplate = new RetryTemplate();
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(3, Collections.singletonMap(SocketTimeoutException.class, true));
retryTemplate.setRetryPolicy(retryPolicy);
retryTemplate.execute(context -> {
// 执行网络请求代码,如Http请求
return null;
});
2. 资源竞争异常(如 ConcurrentModificationException
)
- 异常描述:当一个集合在迭代过程中被修改时抛出。
- 处理方式:使用线程安全的集合类,如
ConcurrentHashMap
替代 HashMap
,CopyOnWriteArrayList
替代 ArrayList
。若使用迭代器,使用 fail - fast
机制的迭代器时,确保在迭代过程中不修改集合结构。如果必须修改,可以创建副本进行修改后再替换原集合。
// 使用线程安全集合类
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
3. 数据库连接异常(如 SQLException
)
- 异常描述:在数据库操作时,如连接获取失败、SQL 语句执行错误等情况抛出。
- 处理方式:使用连接池管理数据库连接,如
HikariCP
。连接池可以自动处理连接的创建、销毁和复用,并且在连接异常时提供一定的恢复机制。同时,在捕获 SQLException
后,根据具体错误码进行针对性处理,如错误码表示连接丢失,可以尝试重新获取连接并重新执行操作。
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/yourdb");
config.setUsername("user");
config.setPassword("password");
HikariDataSource dataSource = new HikariDataSource(config);
Connection conn = null;
try {
conn = dataSource.getConnection();
// 执行数据库操作
} catch (SQLException e) {
if (e.getSQLState().equals("08003")) { // 连接丢失错误码示例
// 尝试重新获取连接并重新执行操作
}
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4. 空指针异常(NullPointerException
)
- 异常描述:当应用程序试图在需要对象的地方使用
null
时抛出。
- 处理方式:在获取对象后,先进行
null
检查。可以使用 Optional
类进行更优雅的 null
处理。
// 传统方式
Object obj = getObject();
if (obj != null) {
// 使用obj
}
// 使用Optional类
Optional<Object> optionalObj = Optional.ofNullable(getObject());
optionalObj.ifPresent(o -> {
// 使用o
});