大家。我编写了一个使用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模块中的最后一行时,一切都会正常。但是我很困惑,这种情况发生在我已经指定了输入流的时候。对读者有价值。
非常感谢。
答案 0 :(得分:0)
分配不等于阅读,reader.readLine()
从连接开始读取。
InputStreamReader正在使用连接来读取字节,在使用连接读取字节之前断开连接
InputStreamReader是从字节流到字符的桥接器 streams:它读取字节和......
答案 1 :(得分:0)
记住它是一个“流”。您需要有一个活动连接才能从流中读取。只有在从流中检索数据后才能关闭连接。
答案 2 :(得分:0)
你正在以错误的顺序做所有事情。这没有意义。
您正在断开连接,然后希望能够从连接中读取。完全胡说八道。通常,您不应断开连接,因为您会干扰HTTP连接池。只需删除它,或者,如果你必须拥有它,请在所有关闭后执行。
您的订单错误,但您根本不需要关闭inStrReader
。关闭BufferedReader
即可。只需删除inStrReader.close()
。
您关闭out
两次。不要那样做。
connect()
隐式发生。你不需要自己打电话。
new URL(url)
就足够了。自2003年左右起,您无需提供HTTPS Handler
。