gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:59:06 25 4
gpt4 key购买 nike

我正在编写一个 Android 应用程序,该应用程序连接到网站并以 JSON 形式检索搜索结果。此函数发生在 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;

}

最佳答案

你的问题不是UnknownHost,而是在你的finally block 中,你没有正确关闭开放资源(不是导致问题的原因,但你本质上做错了)并且你没有捕获所有可能的异常(这就是为什么您的代码无法按您的预期工作的原因)。你最好使用 try{ __.close(); } catch(__Exception e){...} 对于您要关闭的每个资源。这样,如果您的其中一个 close() 调用出现异常,其他资源仍然会关闭,否则您只需将它们保持打开状态并直接跳入 catch block 终于

但是,问题的真正原因是,在收到初始异常然后进入 finally block 之前,您的资源没有被实例化。所以,它们仍然是null。您应该捕获的异常以及 IOExceptionNullPointerException

希望这对您有所帮助。

关于java - 为什么使用 BufferedReader 打开 URL 流时捕获 UnknownHostException 会使我的应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4362561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com