获取UnknownHostException而不是SocketTimeOutExcepetion

时间:2016-02-06 20:54:15

标签: java android exception socket-timeout-exception unknown-host

我是android和Java的新手。我正在尝试从UDACITY学习Android应用程序开发。我试图运行此代码,我期待一个SocketTimeOutExcepetion但我得到的是UnknownHostException。

try {
    final String BASE_URL = "http://api.openweathermap.org/data/2.5/forecast/daily?";
    final String ZIP = "zip";
    final String MODE = "mode";
    final String UNITS = "units";
    final String COUNT = "cnt";
    final String APP_ID = "appid";

    Uri builtUri = Uri.parse(BASE_URL).buildUpon()
                      .appendQueryParameter(ZIP, params[0] + ",in")
                      .appendQueryParameter(MODE,format)
                      .appendQueryParameter(UNITS, units)
                      .appendQueryParameter(COUNT, Integer.toString(numDays))
                      .appendQueryParameter(APP_ID, BuildConfig.OPEN_WEATHER_MAP_API_KEY)
                      .build();
    String str = java.net.URLDecoder.decode(builtUri.toString());
    URL url = new URL(str);

    urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setRequestMethod("GET");
    urlConnection.setConnectTimeout(5000);
    urlConnection.setReadTimeout(5000);
    urlConnection.connect();

    InputStream inputStream = urlConnection.getInputStream();
    StringBuffer buffer = new StringBuffer();

    if (inputStream == null) {
        return null;
    }

    reader = new BufferedReader(new InputStreamReader(inputStream));

    String line;

    while ((line = reader.readLine()) != null)
        buffer.append(line + "/n");

    if (buffer.length() == 0)
        return null;

    forecastJsonStr = buffer.toString();

    Log.v(LOG_TAG,"JSON forcast string:" +forecastJsonStr);
}catch(SocketTimeoutException e) {
    startActivity(new Intent(getActivity(),CheckNet.class));
} catch (IOException e) {
    Log.e("FetchWeatherTask", "Error:" + e.toString());
    return null;
}

我在运行Android 4.0.4版的手机上测试过它。在测试时,我的移动数据和wifi关闭了

2 个答案:

答案 0 :(得分:1)

当您的移动数据和wifi关闭时,套接字层无法将互联网地址(例如" openweathermap.org")解析为IP地址。这就是你得到UnknownHostException的原因。

然而,当您在网络上,并且它能够解析IP地址,并且服务器无法回复时,您将收到SocketTimeoutException。

答案 1 :(得分:0)

如果要模拟异常,请执行以下操作:

  1. 断开数据连接并连接Wi-Fi
  2. 修改您的Wi-Fi连接设置
  3. 更改为静态IP,IP为169.254.0.50,子网为255.255.0.0,网关为169.254.0.1
  4. 更改BASE_URL =" 192.241.169.168/data/2.5/forecast/daily?"
  5. 运行您的应用