Java IOException:流已关闭,NullPointerException与HttpURLConnection断开连接
各位。我正在编写一个函数,该函数通过使用类HttpURLConnection连接到服务器。在代码中,我建立了一个连接,依次调用getOutputStream()和getInputStream()方法。然后我断开连接。在此之后,我尝试获取通过getInputStream()方法获得的数据,但编译器提醒NullPointerException 代码如下: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
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使这一切更干净。