【问题标题】:StackOverflowError when using HTTPUrlConnection使用 HTTPUrlConnection 时出现 StackOverflowError
【发布时间】: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


【解决方案1】:

StackOverflowError 表示您的 sendRequest 递归方法调用被频繁发送,并且堆栈上没有更多内存。 一个很好的解释见What is a StackOverflowError? 首先,您可能应该检查您破坏外观的地方(在handleResponsesendRequest 中是否完全按照您的预期工作。尤其是handleResponse 中的那个看起来是有线的。 如果一切正常,您可以尝试重写您的逻辑以使用循环而不是递归调用。

【讨论】:

    【解决方案2】:

    如果你有一个 StackOverflow,也许你做错了什么,也许你需要更多的堆栈空间。

    您可以尝试通过使用此参数-Xss来增加堆栈空间,例如您可以尝试1或2兆:-Xss1m

    如果您的问题是错误代码,无论您的堆栈大小有多大,您都会收到 StackOverflowException。我不是专家哦 HttpClient,但我可以看到你的sendRequest 方法调用了你的handleResponse 方法,而这个又调用了sendRequest,可能是无限循环?

    【讨论】:

    • 是的!这不是一个无限循环,但它应该能够处理几百万个“循环”。我将尝试从递归调用切换到循环,看看会发生什么。谢谢!
    【解决方案3】:

    sendRequest 和 handleResponse 相互调用,它们执行此操作的时间可能比您想象的要长得多(迭代次数更多)。

    如果这确实是问题(只需记录handleRequest 调用sendRequest 的次数),您可以为handleResponse 构建故障安全/限制,以在尝试次数超过X 次时停止重定向到sendRequest。

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多