unknownhostexception 根源是 dns 解析失败而非连接失败,需依次排查:nslookup/dig 验证 dns 响应、检查 /etc/hosts 格式合法性、确认 java 缓存刷新、检测 udp 53 端口连通性、审查域名字符串是否含非法字符。

UnknownHostException 不是连接失败,而是压根没拿到 IP 地址——连发起 TCP 连接的机会都没有。排查必须从系统网络层开始,不能一上来就改 Java 代码。
DNS 解析本身是否通
别只 ping 域名或 IP,要直接验证 DNS 查询能否返回结果:
- 运行
nslookup api.example.com,看是否返回 A 或 AAAA 记录;若显示connection timed out或server can't find,说明 DNS 请求根本没发出去或没响应 - 换公共 DNS 测试:
nslookup api.example.com 8.8.8.8,能通说明本地 DNS(如公司内网 DNS)异常或被策略拦截 - 用
dig example.com +short获取简洁解析结果,避免 nslookup 的冗余输出干扰判断
/etc/hosts 文件格式是否合法
hosts 优先级高于 DNS,但一行写错就会让整个解析卡住:
- 每行只能是
IPhostname,IP 和域名之间不能有多个空格、不可见字符或开头/结尾多余空格 - 注释必须独占一行,或写在行尾且
#前有空格;127.0.0.1 localhost#comment是非法的,会被当成主机名localhost#comment去解析 - 改完 hosts 后,Java 不会自动刷新缓存——必须重启 JVM,或调用
InetAddress.clearCache()(JDK 8+ 支持)
Java 进程能否发出 DNS 查询
某些环境会静默阻断 DNS 请求:
- 容器或沙箱中可能禁用了 UDP 53 端口:执行
telnet 8.8.8.8 53,失败说明 DNS 出口被封 - Alpine 基础镜像(musl libc)在 Kubernetes 中常因
/etc/resolv.conf缺失或配置错误抛此异常,需显式挂载或设置dnsConfig - 检查是否设置了
-Dnetworkaddress.cache.ttl=0,它不导致解析失败,真正影响的是底层网络策略
域名字符串本身是否干净
很多报错其实不是 DNS 问题,而是传给 Java 的 host 字符串带坑:
- 检查是否含 BOM、全角空格、零宽字符(尤其从配置中心、数据库或前端传入时),可用
host.getBytes(StandardCharsets.UTF_8)打印字节序列快速识别 - URL 构造时多写斜杠(如
http://api.example.com//v1),底层URL.getHost()可能提取出空字符串或非法值 - 用
new URI("https://api.example.com").getHost()替代URL解析,对畸形输入容忍度更高
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











