Java执行HTTP源验证时抛出java.net.ConnectException异常排查
异常根因
从异常栈最底层的java.nio.channels.UnresolvedAddressException可以直接定位:Java进程在发起网络连接时,无法将目标域名app.pluralsight.com解析为有效的IP地址,连接在TCP握手前的DNS解析阶段就直接失败了,根本没有进入HTTP请求发送、响应处理的流程。
你本地浏览器可以正常访问该站点,不代表Java进程有相同的网络访问能力,常见触发场景包括:
- JVM默认不会自动继承系统/浏览器的代理配置:如果你的网络环境需要通过代理访问境外站点,浏览器走代理可以正常解析域名、访问站点,但JVM直连公网时会被网络策略拦截,无法完成DNS解析
- 当前运行环境的DNS服务器配置异常,无法返回该域名的有效解析记录
- 本地安全软件、防火墙策略限制了Java进程的网络访问权限,拦截了对应的DNS查询请求
修复步骤
按照优先级依次排查处理:
- 先确认解析故障
单独运行以下测试代码,验证JVM层面的域名解析能力:
如果这段代码直接抛出import java.net.InetAddress; public class DnsTest { public static void main(String[] args) throws Exception { // 打印解析到的IP,抛异常则说明解析失败 System.out.println(InetAddress.getByName("app.pluralsight.com")); } }UnknownHostException,即可100%确认是DNS解析层面的问题。 - 给HttpClient显式配置代理(最常见场景)
如果你本地访问该站点需要走代理,不要用HttpClient.newHttpClient()创建默认客户端,要在构建客户端时显式传入代理配置,示例:
如果你的代理需要身份认证,还要额外配置import java.net.InetSocketAddress; import java.net.ProxySelector; // 替换成你本地实际可用的代理地址和端口 HttpClient client = HttpClient.newBuilder() .proxy(ProxySelector.of(new InetSocketAddress("127.0.0.1", 7890))) .build();Authenticator传入代理的账号密码。 - 调整JVM DNS配置
如果不需要走代理,可以在IDE的运行配置中给JVM添加启动参数,指定可用的公共DNS服务器(内网环境请替换为公司内部可用的DNS地址):-Dsun.net.spi.nameservice.nameservers=114.114.114.114,8.8.8.8 -Dsun.net.spi.nameservice.provider=default - 排查权限拦截
检查本地防火墙、安全软件的规则,确认没有拦截java进程的出站网络访问请求。
注意:你代码中使用的
HttpResponse.BodyHandlers.discarding()逻辑没有问题,异常发生在连接建立阶段,不需要调整HTTP请求方法、响应体处理器相关的代码。
内容的提问来源于stack exchange,提问作者Shashank Deepak
相关产品推荐
相关产品推荐

