我在使用HTTPUrlConnection时遇到了一些麻烦。代码基本上是在循环中运行,每次都连接到不同的URL,检查响应,如果响应符合某些条件则退出。我得到StackOverflowError,但我不确定我搞砸了什么。我试过没有使用connection.disconnect()
,但无济于事。
另外,你们有没有关于加快下面代码的提示?
由于
线程“main”中的异常java.lang.StackOverflowError at java.security.AccessController.doPrivileged(Native Method)at java.net.Socket.getInputStream(Socket.java:911)at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:642)at 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)at 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;
}
}
}
答案 0 :(得分:1)
StackOverflowError表示您经常发送sendRequest
的递归方法调用,并且堆栈上没有剩余内存。
有关一个很好的解释,请参阅What is a StackOverflowError?
首先,你应该检查一下你看起来的地方(handleResponse
和sendRequest
是否完全按预期工作。特别是handleResponse
中的那个看起来很有线。
如果它应该是你应该尝试重写你的逻辑以使用循环而不是递归调用。
答案 1 :(得分:1)
如果你有一个StackOverflow,也许你做错了,也许你需要更多的空间来堆栈。
您可以尝试通过使用此参数-Xss
来增加堆栈空间,例如,您可以尝试1或2个megas:-Xss1m
。
如果您的问题是错误的代码,无论您的堆栈大小有多大,都会得到StackOverflowException。我不是专家哦HttpClient,但我可以看到你的sendRequest
方法调用了你的handleResponse
方法,而且这个方法再次调用sendRequest
,可能是一个无限循环?
答案 2 :(得分:1)
sendRequest和handleResponse相互调用,它们可能比你想象的要长得多(迭代次数多)。
如果这确实是问题(只记录handleRequest调用sendRequest的次数),你可以为handleResponse构建一个failafe / limit,以便在超过X次尝试时停止重定向到sendRequest。