java.net.UnknownHostException: 无法解析主机 "<url>":主机名没有关联的地址。字符0处输入结束。

130

我创建了一个应用,从我的 Web 服务加载问题,它可以正常工作。但是有时它会崩溃,我不知道为什么会发生这种情况,尤其是因为我已经给它所需的权限。它可以正常工作,但是随机地会崩溃并给我这份报告。

private void sendContinentQuestions(int id) {
    // TODO Auto-generated method stub

    //Get the data (see above)
    JSONArray json = getJSONfromURL(id);
        try{
            for(int i=0; i < json.length(); i++) {
                HashMap<String, String> map = new HashMap<String, String>();
                JSONObject jObject = json.getJSONObject(i);
                longitude":"72.5660200"
                String category_id = jObject.getString("category_id");
                String question_id = jObject.getString("question_id");
                String question_name = jObject.getString("question_name");
                String latitude = jObject.getString("latitude");
                String longitude = jObject.getString("longitude");
                String answer = jObject.getString("answer");
                String ansLatLng = latitude+"|"+longitude ; 
                Log.v("## data:: ###",question_id+"--"+question_name+"-cat id-"+category_id+"--ansLatLng "+ansLatLng+" answer: "+answer);

                all_question.add(new QuestionData(game_id,category_id,question_id,question_name,ansLatLng,answer));
            }
        }catch(JSONException e)        {
            Log.e("log_tag", "Error parsing data "+e.toString());
        }
    }


}
 public JSONArray getJSONfromURL(int id){

    String response = "";
    URL url;
    try {
        url = new URL(Consts.GET_URL+"index.php/Api/getQuestion?cat_id="+id);
        HttpURLConnection http = (HttpURLConnection) url.openConnection();
        http.setRequestMethod("POST");
        InputStream is = http.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        response = br.readLine();
        Log.v("###Response :: ###",response);
        http.disconnect();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch (ProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace(); 
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    //try parse the string to a JSON object
    JSONArray jArray = null;
    try{

        jArray = new JSONArray(response);

    }catch(JSONException e){
        Log.e("log_tag", "Error parsing data "+e.toString());
    }

    return jArray;
}

11-13 15:02:52.307: W/System.err(8012): java.net.UnknownHostException: Unable to resolve host "www.xyz.com": No address associated with hostname
11-13 15:02:52.317: W/System.err(8012):     at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
11-13 15:02:52.317: W/System.err(8012):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
11-13 15:02:52.317: W/System.err(8012):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
11-13 15:02:52.317: W/System.err(8012):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
11-13 15:02:52.327: W/System.err(8012):     at com.abc.xyz.ContinentActivity.getJSONfromURL(ContinentActivity.java:400)
11-13 15:02:52.327: W/System.err(8012):     at com.abc.xyz.ContinentActivity.sendContinentQuestions(ContinentActivity.java:327)
11-13 15:02:52.327: W/System.err(8012):     at com.abc.xyz.ContinentActivity.access$2(ContinentActivity.java:323)
11-13 15:02:52.327: W/System.err(8012):     at com.abc.xyz.ContinentActivity$LoadQuestions.doInBackground(ContinentActivity.java:254)
11-13 15:02:52.327: W/System.err(8012):     at com.abc.xyz.ContinentActivity$LoadQuestions.doInBackground(ContinentActivity.java:1)
11-13 15:02:52.327: W/System.err(8012):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-13 15:02:52.327: W/System.err(8012):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
11-13 15:02:52.327: W/System.err(8012):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-13 15:02:52.327: W/System.err(8012):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-13 15:02:52.337: W/System.err(8012):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-13 15:02:52.337: W/System.err(8012):     at java.lang.Thread.run(Thread.java:841)
11-13 15:02:52.337: W/System.err(8012): Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
11-13 15:02:52.337: W/System.err(8012):     at libcore.io.Posix.getaddrinfo(Native Method)
11-13 15:02:52.337: W/System.err(8012):     at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
11-13 15:02:52.337: W/System.err(8012):     at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
11-13 15:02:52.337: W/System.err(8012):     ... 24 more
11-13 15:02:52.337: E/log_tag(8012): Error parsing data org.json.JSONException: End of input at character 0 of 
11-13 15:02:52.337: W/dalvikvm(8012): threadid=194: thread exiting with uncaught exception (group=0x417c1700)
11-13 15:02:52.337: E/AndroidRuntime(8012): FATAL EXCEPTION: AsyncTask #5
11-13 15:02:52.337: E/AndroidRuntime(8012): java.lang.RuntimeException: An error occured while executing doInBackground()
11-13 15:02:52.337: E/AndroidRuntime(8012):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at java.lang.Thread.run(Thread.java:841)
11-13 15:02:52.337: E/AndroidRuntime(8012): Caused by: java.lang.NullPointerException
11-13 15:02:52.337: E/AndroidRuntime(8012):     at com.abc.xyz.ContinentActivity.sendContinentQuestions(ContinentActivity.java:328)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at com.abc.xyz.ContinentActivity.access$2(ContinentActivity.java:323)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at com.abc.xyz.ContinentActivity$LoadQuestions.doInBackground(ContinentActivity.java:254)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at com.abc.xyz.ContinentActivity$LoadQuestions.doInBackground(ContinentActivity.java:1)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-13 15:02:52.337: E/AndroidRuntime(8012):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)

31
您是否已连接至互联网? - Apoorv
你的日志里打印出响应了吗? - GrIsHu
是的,我已经检查了网络连接。 - Reshma
1
检查手机是否可以访问此URL(例如在浏览器中)。 - user180100
1
不要使用模拟器,我也遇到了同样的问题。我花了一天时间试图解决它。最终,我的解决方案是使用真实的安卓设备进行测试。 - JPerk
所有这些答案都很糟糕,认真地说!对于网络连接差的情况,无论如何都会抛出UnknownHostException异常,而且只要在移动网络上就会发生。响应根本不会到达,你应该超时请求以处理这种情况。 - Arpit J.
13个回答

295

我也遇到过这个问题,重新连接WiFi就能解决。

对于我们来说,可以在启动应用程序时检查手机是否能将主机名解析为IP。如果不能解析,请告知用户检查WiFi,然后退出应用程序。


1
我不得不关掉我的手机! - Francisco Corrales Morales
6
在Android 7中,这个问题还存在吗?我在打开应用程序时会随机遇到这种行为。应用程序的网络连接可用,但它无法访问Web服务。这可能是什么原因?网络中有几个设备都有同样的问题。 - X-HuMan
有没有一种方法可以向用户发出警报或提示,因为程序员可能会理解问题,但用户不会,他不会来到StackOverflow,他只会卸载应用程序。 - DragonFire
真是个救星啊。看起来是WiFi的一个bug。断开连接后一切都很顺利。 - Tarun Deep Attri

31
如果重新连接 WiFi 无法解决问题,尝试重新启动设备。
这对我有用,希望能帮到你。

哎呀,这是一个Wi-Fi问题,而不是Android的问题...!我应该先放置检查互联网是否存在的代码。谢谢@Jiyeh。 - gumuruh

24

我在模拟器中遇到了相同的异常(Android Studio on OSX),但连接到相同的URL时,iOS模拟器可以正常工作...看起来这一切都源于当我使用个人热点连接互联网时运行模拟器,然后过了一会儿连接wifi回来,模拟器不喜欢新的互联网连接,似乎认为旧的热点是当前连接,而它已经停止工作了。

关闭并重新启动模拟器解决了问题!


一样的情况,重启模拟器后就可以了。 - Shailendra Madda

10

我遇到了相同的错误,问题在于我使用了 VPN 并且没有意识到这一点。断开 VPN 连接并重新连接到我的 WIFI 网络后,问题得到了解决。


这个解决方案对我来说有效,可以断开VPN连接。 - Abhijit Chakra

8
错过在清单文件中配置标签
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

5

在我的家庭WiFi上运行Android应用程序时,当我尝试在没有关闭模拟器的情况下在不同的WiFi上运行它时,遇到了这个错误。

只需关闭模拟器并重新启动应用程序即可解决问题!


3

我遇到了同样的问题。 java.net.UnknownHostException:无法解析主机“”...

我正在使用Visual Studio 2019和Xamarin。

我也切换回了我的WiFi,但是当时使用的是热点。

我通过清除模拟器来解决了这个问题。将其恢复为出厂设置。然后重新运行Visual Studio Xamarin应用程序,它会再次部署您的应用程序到全新的模拟器。

它起作用了。我以为我要花几天时间来解决这个问题。幸运的是,这篇文章指引了我正确的方向。

我无法理解为什么在没有代码更改的情况下它之前完美地工作,然后突然停止了。

这是我的参考代码:

using var response = await httpClient.GetAsync(sb.ToString());
string apiResponse = await response.Content.ReadAsStringAsync();

2
我有同样的问题,但稍有不同。我添加了NetworkConnectionCallback来检查运行时Internet连接发生变化的情况,并在发送所有请求之前进行如下检查:
private fun isConnected(): Boolean {
    val activeNetwork = cManager.activeNetworkInfo
    return activeNetwork != null && activeNetwork.isConnected
}

存在一种状态叫做“连接中”(当您打开wifi时可以看到,图标开始闪烁,在连接到网络后,图像静止不动)。 因此,我们有两种不同的状态:一个是“连接”,另一个是“连接中”。当Retrofit尝试发送请求但互联网连接被禁用时,它会抛出UnknownHostException异常。 我忘记在负责发送请求的函数中添加另一种类型的异常。

try{
//for example, retrofit call
}
catch (e: Exception) {
        is UnknownHostException -> "Unknown host!"
        is ConnectException -> "No internet!"
        else -> "Unknown exception!"
    }

这只是一个与此问题相关的棘手时刻。

希望我能帮助到某些人)


1
cManager是什么? - undefined
cManager是什么? - NerdyDeeds

2

我正在使用Android模拟器测试我的应用程序,我通过在Android模拟器设备上关闭并重新打开Wi-Fi来解决了这个问题!它完美地解决了。

翻译:我在用安卓模拟器测试我的应用时遇到了问题,后来我通过在模拟器设备上关闭再重新打开Wi-Fi就解决了。非常顺利。


我做了相同的事情,只是使用移动数据。 - Primož Ivančič

1

我遇到了同样的问题,但是是在使用Glide时。当我要断开WiFi并重新连接(就像这里建议的那样)时,我注意到我处于飞行模式 ‍♂️


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接