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

Java IOException:流已关闭,NullPointerException与HttpURLConnection断开连接,java,nullpointerexception,connection,httpurlconnection,inputstreamreader,Java,Nullpointerexception,Connection,Httpurlconnection,Inputstreamreader,各位。我正在编写一个函数,该函数通过使用类HttpURLConnection连接到服务器。在代码中,我建立了一个连接,依次调用getOutputStream()和getInputStream()方法。然后我断开连接。在此之后,我尝试获取通过getInputStream()方法获得的数据,但编译器提醒NullPointerException 代码如下: DataOutputStream out = null; InputStreamReader inStrReader = null

各位。我正在编写一个函数,该函数通过使用类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();
            }
        }
    }
DataOutputStream out=null;
InputStreamReader inStrReader=null;
BufferedReader reader=null;
HttpURLConnection=null;
试一试{
URL postrl=新URL(null,URL,new sun.net.www.protocol.https.Handler());
connection=(HttpURLConnection)postrl.openConnection();
…//一些设置方法
connection.connect();
out=新的DataOutputStream(connection.getOutputStream());
out.writeBytes(JSONObject.toJSONString(param));
out.flush();
out.close();
inStrReader=新的InputStreamReader(connection.getInputStream(),“utf-8”);
读卡器=新的BufferedReader(inStrReader);

connection.disconnect();//分配不等于读取,
reader.readLine()
从连接开始读取

如果正在使用连接读取字节,请先断开连接,然后再使用连接读取字节

InputStreamReader是从字节流到字符流的桥梁 流:它读取字节和


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

您以错误的顺序执行所有操作。这没有意义

  • 您正在断开连接,然后希望能够从连接中读取。这里完全是胡说八道。通常情况下,您根本不应该断开连接,因为您会干扰HTTP连接池。只需将其删除,或者,如果您必须这样做,请在关闭所有连接后再执行

  • 您以错误的顺序关闭,但根本不需要关闭
    inStrReader
    。关闭
    BufferedReader
    即可。只需删除
    inStrReader.close()的所有代码即可

  • 你要关两次门,不要这样做

  • connect()
    是隐式发生的。您不需要自己调用它

  • 新建URL(URL)
    就足够了。大约从2003年起,您就不需要提供HTTPS
    处理程序了


  • 在断开连接之前,我已经将inputstream对象放入变量“reader”中。但是,当我调试时,reader.readLine()方法获取nullpointexception。但是您没有读取任何内容,为了读取连接,应该打开连接,因为您正在使用itI进行读取。感谢您的明确解释。Thx为您提供建议。我维护此代码只是因为HP fortify(HP企业安全产品)。如果我删除close()方法,然后我将收到一些带有未发布资源的警告:stream。然后不要将
    InputStreamReader
    声明为变量。只需执行
    new BufferedReader(new InputStreamReader(connection.getInputStream(),“UTF-8”))
    。这是初始代码,fortify报告未发布的资源:stream。然后我将InputStreamReader声明为一个变量。所以关闭它,这无关紧要,但在
    BufferedReader
    之前不可以。使用try with resources使这一切更干净。