【问题标题】:Fatal Exception: java.net.UnknownHostException Unable to resolve host "maps.googleapis.com": No address associated with hostname致命异常:java.net.UnknownHostException 无法解析主机“maps.googleapis.com”:没有与主机名关联的地址
【发布时间】:2021-09-04 01:23:07
【问题描述】:

如何处理这个崩溃?我的项目中没有任何文件 Dns.kt,随机用户崩溃。

Dns.kt 第 49 行 好的http3.Dns$Companion$DnsSystem.lookup

致命异常:java.net.UnknownHostException 无法解析主机“maps.googleapis.com”:没有与主机名关联的地址 java.net.Inet6AddressImpl.lookupHostByName

Fatal Exception: java.net.UnknownHostException: Unable to resolve host "maps.googleapis.com": No address associated with hostname
       at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:156)
       at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
       at java.net.InetAddress.getAllByName(InetAddress.java:1152)
       at okhttp3.Dns$Companion$DnsSystem.lookup(Dns.kt:49)
       at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.kt:164)
       at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.kt:129)
       at okhttp3.internal.connection.RouteSelector.next(RouteSelector.kt:71)
       at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:205)
       at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
       at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
       at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
       at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
       at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
       at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
       at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
       at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
       at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run(Thread.java:919)

由 android.system.GaiException 引起 android_getaddrinfo 失败:EAI_NODATA(没有与主机名关联的地址) okhttp3.Dns$Companion$DnsSystem.lookup

Caused by android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
       at libcore.io.Linux.android_getaddrinfo(Linux.java)
       at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:74)
       at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:200)
       at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:74)
       at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:135)
       at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
       at java.net.InetAddress.getAllByName(InetAddress.java:1152)
       at okhttp3.Dns$Companion$DnsSystem.lookup(Dns.kt:49)
       at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.kt:164)
       at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.kt:129)
       at okhttp3.internal.connection.RouteSelector.next(RouteSelector.kt:71)
       at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:205)
       at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
       at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
       at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
       at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
       at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
       at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
       at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
       at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
       at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
       at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run(Thread.java:919)

【问题讨论】:

  • 你有解决办法吗
  • 不,我在实时用户应用程序中遇到错误,我无法复制此问题并且没有解决方案。
  • 当您在应用程序中并且设备没有互联网连接时,可能会发生这种情况。这就是我们能够重现此问题的方法,只需关闭 WiFi 和移动数据,几秒钟后应用程序就会崩溃。

标签: android okhttp


【解决方案1】:

尝试将自己的 dns 添加到 okhttp 以捕获异常。我没查。

OkHttpClient.Builder()
    .dns(object : Dns {
        override fun lookup(hostname: String): List<InetAddress> {
            return try {
                Dns.SYSTEM.lookup(hostname)
            } catch (t: Throwable) {
                emptyList()
            }
        }
    })

如果需要,您还可以在此处覆盖主机名的 IP 地址。

【讨论】:

  • 我已经按照你的建议做了,但这并不能解决问题。
【解决方案2】:

您可能需要在 Android Manifest 中请求互联网许可,如此答案所述:https://stackoverflow.com/a/6355961/11840668

【讨论】:

  • 感谢您的回复,但我已经在清单中定义了互联网权限,我从 playstore 现场用户那里得到了这个崩溃,无法在调试中复制
猜你喜欢
  • 1970-01-01
  • 2017-12-04
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多