为什么在使用BufferedReader打开URL流崩溃我的应用程序时捕获UnknownHostException?

时间:2010-12-06 01:51:20

标签: java android exception-handling try-catch bufferedreader

我正在编写一个连接到网站并以JSON形式检索搜索结果的Android应用程序。此函数发生在AsyncTask中,AsyncTask设置为与UI分开的流。我需要处理连接中断/不存在/太潜伏的情况。我需要处理这种情况,以便向用户显示AlertDialog,让他们知道连接是坏的。我看过帖子建议为URLConnection设置超时参数,但我现在没有使用URLConnection。

现在,当我有数据连接时,该函数执行完美,但没有连接时则不行。当我运行模拟器并禁用我的PC的互联网连接时,运行该功能会弹出“强制关闭”消息并产生UnknownHostException。我正在捕捉这个异常,但我的应用程序仍然崩溃。

我还需要处理一个没有找到缩略图的情况,这会产生FileNotFoundException。

请告诉我应该怎么做。感谢。

@Override
protected HashMap<String, String> doInBackground(Object... params) {
    InputStream imageInput = null;
    FileOutputStream imageOutput = null;
    try {   
        URL url = new URL("http://www.samplewebsite.com/" + mProductID);
        BufferedReader reader = 
                new BufferedReader(new InputStreamReader(url.openStream()));
        String jsonOutput = "";
        String temp = "";
        while ((temp = reader.readLine()) != null) {
            jsonOutput += temp;
        }
        JSONObject json = new JSONObject(jsonOutput);

        // ... Do some JSON parsing and save values to HashMap

        String filename = mProductID + "-thumbnail.jpg";
        URL thumbnailURL = new URL("http://www.samplewebsite.com/img/" + mProductID + ".jpg");

        imageInput = thumbnailURL.openConnection().getInputStream();
        imageOutput = mContext.openFileOutput(outputName, Context.MODE_PRIVATE);

        int read;
        byte[] data = new byte[1024];
        while ((read = imageInput.read(data)) != -1) {
            imageOutput.write(data, 0, read);
        }

        reader.close();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    finally {
        try {
            imageOutput.close();
            imageInput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

return mProductInfoHashMap;

}

1 个答案:

答案 0 :(得分:1)

你的问题不是UnknownHost,而是在你的finally块中你没有正确关闭开放资源(不是导致问题的原因,但你实际上做错了)并且你没有捕获所有可能的异常(这就是为什么你的代码没有按预期工作的原因)。对于你正在关闭的每个资源,你最好有try{ __.close(); } catch(__Exception e){...}。这样,如果您的close()个来电之一有异常,其他资源仍会关闭,否则您只是将其打开并直接跳转到catch中的finally区块。< / p>

然而,问题的真正原因是您的资源在获得初始异常然后进入finally块之前未实例化。所以,他们仍然是null。您应该捕获的例外以及IOExceptionNullPointerException

希望这可以帮助你。