【发布时间】:2015-09-29 10:54:54
【问题描述】:
我在使用 HTTPUrlConnection 时遇到了一些问题。代码基本上是循环运行的,每次都连接到不同的 URL,检查响应,如果响应满足某些条件则退出。我收到 StackOverflowError,但我不确定我搞砸了什么。我尝试不使用connection.disconnect(),但无济于事。
另外,你们对加快下面的代码有什么建议吗?
谢谢
线程“主”java.lang.StackOverflowError 中的异常 java.security.AccessController.doPrivileged(Native Method) 在 java.net.Socket.getInputStream(Socket.java:911) 在 sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:642) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1535) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) 在 java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) 在 Main.sendRequest(Main.java:96) 在 Main.handleResponse(Main.java:140)
public class Main {
static int counter;
public static void main(String [] args) {
counter = 0;
sendRequest("http://192.168.0.1");
}
public static void sendRequest(String path) {
try {
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
String response = stringBuilder.toString();
handleResponse(response);
inputStreamReader.close();
bufferedReader.close();
}
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void handleResponse(String response) {
String s = response.substring(62,67);
if (s.equals("Statu")) {
return;
} else {
sendRequest("http://192.168.0.1/" + counter);
counter += 1;
}
}
}
【问题讨论】:
-
这里没有循环,但是有递归,所以栈溢出了。尝试编写您声称已经存在的循环。
-
您的计数器永远不会增加。在计数器递增之前进行递归调用。除非响应码不是HTTP_OK(或者发生异常)
标签: java sockets stack-overflow httpurlconnection