IOException:流已关闭,NullPointerException与HttpURLConnection断开连接

时间:2017-08-24 06:02:29

标签: java nullpointerexception connection httpurlconnection inputstreamreader

大家。我编写了一个使用Class HttpURLConnection连接到服务器的函数。在代码中,我建立了一个连接,按顺序调用getOutputStream()和getInputStream()方法。然后我断开了连接。在此之后,我尝试获取getInputStream()方法获得的数据,但编译器提醒NullPointerException。

以下代码:

    DataOutputStream out = null;
    InputStreamReader inStrReader = null;
    BufferedReader reader = null;
    HttpURLConnection connection = null;

    try {
        URL postUrl = new URL(null, url, new sun.net.www.protocol.https.Handler());
        connection = (HttpURLConnection) postUrl.openConnection();
        ...//some setting methods
        connection.connect();
        out = new DataOutputStream(connection.getOutputStream());
        out.writeBytes(JSONObject.toJSONString(param));
        out.flush();
        out.close();

        inStrReader = new InputStreamReader(connection.getInputStream(), "utf-8");
        reader = new BufferedReader(inStrReader);
        connection.disconnect();   //<--HERE, release the connection
        StringBuilder stringBuilder = new StringBuilder();
        for (String line = reader.readLine(); line != null; line = reader.readLine()) {     //<--null pointer
            stringBuilder.append(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (inStrReader != null) {
            try {
                inStrReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

调试尝试后,当我将断开线移动到finally模块中的最后一行时,一切都会正常。但是我很困惑,这种情况发生在我已经指定了输入流的时候。对读者有价值。

非常感谢。

3 个答案:

答案 0 :(得分:0)

分配不等于阅读,reader.readLine()从连接开始读取。

InputStreamReader正在使用连接来读取字节,在使用连接读取字节之前断开连接

  

InputStreamReader是从字节流到字符的桥接器   streams:它读取字节和......

答案 1 :(得分:0)

记住它是一个“流”。您需要有一个活动连接才能从流中读取。只有在从流中检索数据后才能关闭连接。

答案 2 :(得分:0)

你正在以错误的顺序做所有事情。这没有意义。

  1. 您正在断开连接,然后希望能够从连接中读取。完全胡说八道。通常,您不应断开连接,因为您会干扰HTTP连接池。只需删除它,或者,如果你必须拥有它,请在所有关闭后执行。

  2. 您的订单错误,但您根本不需要关闭inStrReader。关闭BufferedReader即可。只需删除inStrReader.close()

  3. 的所有代码
  4. 您关闭out两次。不要那样做。

  5. connect()隐式发生。你不需要自己打电话。

  6. new URL(url)就足够了。自2003年左右起,您无需提供HTTPS Handler