【问题标题】:How to know the cause of UnknownHostException?如何知道 UnknownHostException 的原因?
【发布时间】:2012-04-03 12:26:48
【问题描述】:

如果服务器关闭或没有互联网连接,则会抛出 UnknownHostException。如何判断UnknownHostException是因为服务器宕机还是没有网络连接而被抛出?

原因是我需要通知用户错误的原因。我必须显示类似“抱歉。该服务目前不可用。请稍后再试”或“您没有互联网连接”。

【问题讨论】:

    标签: java android exception unknown-host


    【解决方案1】:

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

    ConnectivityManager conMgr =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    
    if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED 
        ||  conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING  ) {
    ...
    }
    

    编辑:

    恕我直言,没有办法告诉确定手机互联网连接已关闭。 但是除了检查网络状态之外,您还可以做一个简单的测试,例如从 Internet 上的网站下载一个小页面(选择一些可靠的服务器)。

    这种双重测试的结果应该在 99% 的情况下都是准确的。

    【讨论】:

    • 这样检查网络状态并不是检查互联网连接可用性的万无一失的方法。在进行上述验证后,互联网连接可能会立即断开。我正在寻找一种方法来了解 UnknownHostException 的原因是由于缺乏互联网连接还是仅仅是因为主机已关闭。
    • 谢谢!目前,我已经在上面进行了类似的验证,以检查设备的网络连接。但是,正如预期的那样,它不会检查 Internet 连接的可用性。连接到网站是检查互联网连接可用性的唯一方法吗?即使没有他们的同意,仅仅为了这个目的而连接到像谷歌这样的第三方网站是否合乎道德?还是真的不需要征求同意?
    • 我认为像 Google 这样规模的公司不会介意回答您的“类似 ping”的查询(除非每秒有数百个);)
    【解决方案2】:

    抛出UnKnownHostException 表示无法确定主机的IP 地址。 并非没有互联网连接或服务器关闭。

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

    请参考LINK

    要检查互联网连接使用 bwlow 方法::

    //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 表示第一部分。您应该指出 InetAddress.getByName() 方法会抛出该问题。
    • 嗨。感谢你的回答。但是,这并不能回答我的问题。我知道抛出 UnknownHostException 表示无法确定主机的 IP 地址。但是,其原因可能是主机已关闭或没有互联网连接。有没有办法知道抛出异常的原因? UknownHostException 太笼统了。
    【解决方案3】:

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

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

    【讨论】:

    • 我对此的评论和塞巴斯蒂安一样。
    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 2015-07-30
    • 2016-11-22
    • 2016-11-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多