尽管处理了异常,IOException仍会停止应用程序

时间:2013-03-25 10:42:56

标签: java

有时我打开一个流:

stream = url.openStream();
BufferedReader buffReader = new BufferedReader(new InputStreamReader(stream));

我得到以下异常:

java.io.IOException: 
    Server returned HTTP response code: 500 for URL: https://...

我的应用程序结束了,虽然我正在处理异常:

catch (IOException ioe) {
    ioe.printStackTrace();
}

有人可以向我解释为什么捕获块没有进入虽然它是IOEcxeption吗?

THX

编辑(附加代码; - )

private String request(URL url) {

    InputStream stream = null;
    String line, response = new String();

    try {
        stream = url.openStream();
        BufferedReader buffReader = 
            new BufferedReader(new InputStreamReader(stream));

        while ((line = buffReader.readLine()) != null)
            response += line;

    } catch (MalformedURLException mue) {
        mue.printStackTrace();
    } catch (HTTPException httpexc) {
        httpexc.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } finally {
        try {
            stream.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    return response;
}

我经常在我的应用程序中运行此代码,有时我会得到提到的异常。

这是stacktrace的一部分:

java.io.IOException: Server returned HTTP response code: 500 for URL: ...
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)

1 个答案:

答案 0 :(得分:2)

您的异常处理中存在错误。如果openStream()调用中出现异常,则finally阻止将尝试在close()引用上调用null,您将获得一个NPE。

这可以解释你所看到的行为:

  1. openStream()失败。
  2. catch (IOException ioe) {ioe.printStackTrace();}打印堆栈跟踪。
  3. finally块抛出NPE,导致request()异常终止。
  4. 如果request()调用正在某个没有“未捕获异常处理程序”的线程上运行,那么由于NPE,该线程可能会无声地死亡。