0

有时当我打开一个流时:

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();
}

有人可以向我解释为什么 catch 块没有进入,尽管它是一个 IOEcxeption 吗?

谢谢

编辑(附加代码;-)

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;
}

我经常在我的应用程序中运行这段代码,只是有时我得到提到的异常。

这是堆栈跟踪的一部分:

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)
4

1 回答 1

2

您的异常处理中有一个错误。如果调用中抛出异常openStream(),则finally块将尝试调用close()引用null,您将获得 NPE。

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

  1. openStream()失败。
  2. catch (IOException ioe) {ioe.printStackTrace();}打印堆栈跟踪。
  3. finally块抛出一个NPE,导致request()异常终止。
  4. 如果request()调用在没有“未捕获的异常处理程序”的某个线程上运行,则该线程可能会由于 NPE 而静默死亡。
于 2013-03-25T11:13:46.933 回答