如何确定UnknownHostException的原因?

5

如果服务器宕机或没有网络连接,将抛出UnknownHostException异常。我该如何确定是因为服务器宕机还是没有网络连接而引发了UnknownHostException异常?

这是因为我需要通知用户错误的原因。我必须显示类似于“对不起。服务当前不可用。请稍后再试”或“您没有网络连接”的内容。

3个回答

4

您可以检查网络状态以确定是否有可用的互联网连接(尽管不是100%可靠):

ConnectivityManager conMgr =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED 
    ||  conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING  ) {
...
}

编辑:

我认为,无法确定手机的互联网连接是否中断。

但是,除了检查网络状态之外,您可以执行一个简单的测试,例如从互联网上下载一个小页面(选择一些可靠的服务器)。

这个双重测试的结果应该有99%的准确率。


1
像这样检查网络状态并不是检查Internet连接可用性的万无一失的方法。在上面的验证完成后,互联网连接可能会断开。我正在寻找一种方法,以了解UnknownHostException的原因是由于缺乏互联网连接还是主机停机引起的。 - Arci
谢谢!目前,我已经在进行类似的验证以检查设备的网络连接。然而,正如预期的那样,它并没有检查互联网连接的可用性。连接到一个网站是检查互联网连接可用性的唯一方法吗?即使没有他们的同意,连接到第三方网站(如Google)仅仅为了这个目的是合法的吗?或者在这件事上不需要征求同意? - Arci
1
我认为像谷歌这样规模的公司不会介意回答你的“ping-like”查询(除非每秒有数百个);) - Sébastien

2

当主机的IP地址无法确定时,会抛出UnKnownHostException异常。这并不意味着没有网络连接或服务器宕机。

还要检查您是否在清单文件中添加了Internet权限。

请参考此链接

使用以下方法检查互联网连接:

//To check whether network connection is available on device or not
public boolean checkInternetConnection(Activity _activity) {
    ConnectivityManager conMgr = (ConnectivityManager) _activity.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (conMgr.getActiveNetworkInfo() != null
            && conMgr.getActiveNetworkInfo().isAvailable()
            && conMgr.getActiveNetworkInfo().isConnected())
        return true;
    else
        return false;
}//checkInternetConnection()

如果服务器宕机,大多数情况下你会收到连接超时异常。


+1 for the first part. 你应该指出 InetAddress.getByName() 方法会抛出异常。 - Gray
你好。感谢回答。然而,这并没有回答我的问题。我知道UnknownHostException被抛出来表示无法确定主机的IP地址。然而,引起这种情况的原因可能是主机宕机或者没有网络连接。有没有办法知道抛出异常的原因?UnknownHostException太笼统了。 - Arci

0

您可以使用ConnectivityManager来检查网络状态。

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
bool hasConnectivity = connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();

我的评论与Sebastian的相同。 - Arci

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