Java try块创建RestHighLevelClient时直接进finally块,无异常也不进catch
可能的原因
- 你当前只捕获了
Exception类型的异常,而RestHighLevelClient初始化过程中抛出的是Error类型的Throwable:比如依赖缺失抛出的NoClassDefFoundError、依赖版本不匹配抛出的NoSuchMethodError/LinkageError都属于Error范畴,Error和Exception是平级的Throwable子类,你的catch块不会捕获这类问题,但是finally块无论出现任何类型的Throwable都会执行,就会出现直接跳转finally、不进catch的表现。 - 执行当前代码的线程被外部中断:比如上层调用方触发了线程中断,部分底层网络IO逻辑响应中断时不会抛出常规Exception,直接跳出执行流进入finally块。
- 调试器显示偏差:部分情况下IDE调试的行号映射和实际执行逻辑不一致,或者JIT编译优化导致你观察到的执行节点和实际逻辑有出入。
排查方案
- 首先修改catch块的捕获范围为
Throwable,并打印堆栈信息,就能拿到具体的错误原因,示例修改:
try{ // 原有代码 }catch(Throwable t){ t.printStackTrace(); // 或者用你项目的日志框架打印错误栈 } finally{}
绝大多数情况下你会在这里看到依赖相关的错误,这是RestHighLevelClient初始化最常见的问题。
- 检查
RestHighLevelClient的版本和你项目中依赖的apache httpclient、jackson等公共组件的版本是否匹配,Elasticsearch官方客户端对依赖版本要求非常严格,版本不匹配大概率会抛出Error类型的问题。 - 确认打包后的运行环境是否包含了所有需要的依赖,避免打包遗漏导致类加载失败。
- 可以临时在初始化代码前后增加日志打印,不用断点调试,确认代码执行的真实流程,排除调试器的干扰。
内容的提问来源于stack exchange,提问作者Ganesh Bejawada
相关产品推荐
相关产品推荐

