You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加INTERNET权限后仍遇java.net.UnknownHostException问题求助

排查间歇性java.net.UnknownHostException问题

这种间歇性的DNS解析问题我之前在Android项目里碰过好几次,太闹心了!咱们一步步拆解可能的原因和对应的解决办法:

1. 优先排查DNS解析异常(最常见原因)

间歇性的域名解析失败,大概率是DNS缓存或服务器不稳定导致的:

  • 验证DNS是否是根因:直接用目标服务器的IP地址替换xyz.com发起请求,如果用IP时完全稳定,那肯定是域名解析的问题。
  • 绕过应用/系统DNS缓存:在代码中手动触发DNS解析,获取所有可用IP后轮询尝试,避免依赖单一缓存结果:
    // 获取域名对应的所有IP
    InetAddress[] addresses = InetAddress.getAllByName("xyz.com");
    // 轮询尝试连接每个IP
    for (InetAddress addr : addresses) {
        try {
            // 用addr.getHostAddress()替换域名构建请求URL
            String url = "http://" + addr.getHostAddress() + "/your-api-path";
            // 执行请求逻辑
            break; // 成功则跳出循环
        } catch (IOException e) {
            // 尝试下一个IP
            continue;
        }
    }
    
  • 强制刷新系统DNS缓存:引导用户开关飞行模式或重启WiFi,让系统重新获取DNS记录。

2. 排查网络链路波动或切换干扰

即使WiFi显示已连接,也可能存在隐性的链路问题:

  • 关闭智能网络切换:如果设备开启了「WiFi+移动数据」自动切换模式,切换过程中可能出现短暂的解析请求丢包,建议暂时关闭移动数据,仅用WiFi测试。
  • 增加异常重试机制:针对UnknownHostException捕获后进行1-2次重试,很多时候只是单次请求的网络波动导致的:
    int maxRetries = 2;
    int retryCount = 0;
    boolean requestSuccess = false;
    
    while (!requestSuccess && retryCount < maxRetries) {
        try {
            // 你的Web Service请求逻辑
            requestSuccess = true;
        } catch (UnknownHostException e) {
            retryCount++;
            // 等待1秒后重试,避免频繁请求
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
                break;
            }
        }
    }
    

3. 检查路由器/系统DNS配置

如果多个设备都出现类似问题,可能是路由器的DNS服务器不稳定:

  • 手动指定公共DNS:在WiFi设置中手动更换DNS服务器为公共可靠的选项,比如8.8.8.8(谷歌)或114.114.114.114(国内),测试是否还会出现解析失败。
  • 设备端手动验证DNS:用adb命令在设备端执行解析测试,看是否能稳定返回结果:
    adb shell nslookup xyz.com
    
    如果执行命令时也间歇性失败,那就是DNS服务器的问题。

4. 检查网络库的自定义配置

如果你用的是OkHttp、Retrofit这类网络库,可能是库的DNS缓存或连接池配置导致的:

  • 自定义OkHttp的DNS实现:跳过默认的DNS缓存,每次请求都重新解析域名:
    OkHttpClient client = new OkHttpClient.Builder()
        .dns(hostname -> Arrays.asList(InetAddress.getAllByName(hostname)))
        .build();
    
  • 调整连接池参数:如果使用了连接复用,可能因过期连接导致异常,可以缩短连接存活时间:
    ConnectionPool connectionPool = new ConnectionPool(5, 1, TimeUnit.MINUTES);
    OkHttpClient client = new OkHttpClient.Builder()
        .connectionPool(connectionPool)
        .build();
    

内容的提问来源于stack exchange,提问作者roopa poojary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:45:45