MST

星途 面试题库

面试题:Java在分布式系统中常见的运行时异常及处理方式

在Java分布式系统开发中,经常会遇到一些运行时异常,比如网络异常、资源竞争异常等。请列举至少3种常见的运行时异常,并分别阐述如何在代码层面进行处理以增强系统的稳定性和可靠性。
39.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

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 替代 HashMapCopyOnWriteArrayList 替代 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
});