UnresolvedAddressException 是 Java 在 Socket 连接前无法解析 host 为 IP 的异常,主因是 host 含协议头、空格、null、非法格式或 DNS 不可达,而非网络不通;需清洗输入并显式调用 InetAddress.getByName 提前校验。

UnresolvedAddressException 不是网络连通性问题,而是 Java 在发起 NIO 连接前就卡在了地址解析环节 —— 它根本没走到发包、超时或拒绝连接那步,连 IP 地址都拿不到。
真正的原因不是“连不上”,而是“认不出”
这个异常发生在 InetSocketAddress 构造或 SocketChannel.connect() 调用时,Java 尝试把传入的 host 字符串转成 IP 地址失败。常见触发点包括:
- host 字符串带协议头,比如
"https://api.example.com:443"或"http://127.0.0.1" - host 含前后空格或不可见字符,例如
" example.com "或"\tlocalhost\n" - host 是 null、空字符串,或纯数字但格式非法(如
"8.8.8.8:53"—— 端口不能混在 host 里) - 使用
"localhost",但运行环境(如容器、CI)中/etc/hosts缺失映射,或 IPv6 优先但未启用::1 - 域名本身不存在,或 DNS 配置错误、DNS 服务不可达(注意:这不是网络不通,是 DNS 解析链路断了)
安全构造 InetSocketAddress 的关键动作
别依赖“传进去再看”,要在创建 socket 前主动清洗和验证:
- 对原始 host 字符串执行
.trim(),再检查是否为空 - 显式调用
InetAddress.getByName(host),捕获UnknownHostException—— 它比UnresolvedAddressException更早暴露问题,且语义更明确 - 若业务允许回环访问,优先用
"127.0.0.1"或"::1",避免依赖系统 hosts 或 DNS - 配置中心或命令行传入的地址,必须做白名单校验或正则过滤(例如只允许字母、数字、短横线、点)
遇到异常时该怎么处理
捕获 UnresolvedAddressException 本身意义有限,它只是表象。重点应放在预防和快速定位上:
- 日志中务必打印出原始 host 字符串(带引号),方便一眼看出是否有空格、协议头等脏数据
- 不要只 catch 它,建议同时捕获
UnknownHostException和IllegalArgumentException,覆盖解析全链路 - 对关键服务(如 Kafka、HDFS、注册中心),启动时做预检:用
InetAddress.getByName()主动解析配置地址并记录结果 - 在容器化部署中,避免硬编码
"localhost";改用 service 名称,并确认 DNS 策略(如 Kubernetes 的 CoreDNS 是否生效)

















