使用 HTTPUrlConnection 时出现 StackOverflowError

StackOverflowError when using HTTPUrlConnection

我在使用 HTTPUrlConnection 时遇到了一些问题。代码基本上是 运行 循环,每次连接到不同的 URL,检查响应,如果响应满足某些条件则退出。我收到 WhosebugError,但我不确定我搞砸了什么。我尝试不使用 connection.disconnect() 但无济于事。

此外,你们有什么关于加速下面代码的提示吗?

谢谢

Exception in thread "main" java.lang.WhosebugError 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) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at 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;
        }
    }
}

WhosebugError 表示您对 sendRequest 的递归方法调用被发送到经常,堆栈上没有剩余内存。 有关详细解释,请参阅 What is a WhosebugError? 首先,您可能应该检查您破坏外观的地方(在 handleResponsesendRequest 中是否确实按您预期的那样工作。尤其是在 handleResponse 中的地方看起来有线。 如果一切正常,您可以尝试重写您的逻辑以使用循环而不是递归调用。

如果您有 Whosebug,也许您做错了什么,也许您需要更多 space 用于堆栈。

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

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

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

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