当前位置: 首页 > 知识库问答 >
问题:

使用HTTPUrlConnection时的StackOverflow错误

周宸
2023-03-14

我在使用HTTPUrlConnection时遇到了一些问题。代码基本上是在循环中运行的,每次都连接到不同的URL,检查响应,如果响应满足某些条件,则退出。我被StackOverflowerr搞砸了,但我不确定自己搞砸了什么。我没有使用连接就尝试了。断开()。

另外,你们有什么加快下面代码的建议吗?

谢谢

线程“main”java中出现异常。java上的lang.StackOverflowerr。安全访问控制器。java上的doPrivileged(本机方法)。网插座sun上的getInputStream(Socket.java:911)。网www.http。HttpClient。在sun上解析HTTP(HttpClient.java:642)。网www.protocol。http。HttpURLConnection。sun上的getInputStream0(HttpURLConnection.java:1535)。网www.protocol。http。HttpURLConnection。java上的getInputStream(HttpURLConnection.java:1440)。网HttpURLConnection。getResponseCode(HttpURLConnection.java:480)位于Main。sendRequest(Main.java:96)位于Main。HandlerResponse(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;
        }
    }
}

共有3个答案

公羊向荣
2023-03-14

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

如果这确实是问题所在(只需记录HandlerRequest调用sendRequest的次数),您可以为HandlerResponse建立故障保护/限制,以便在尝试次数超过X次时停止重定向到sendRequest。

赵永逸
2023-03-14

如果堆栈溢出,可能是做错了什么,可能是堆栈需要更多的空间。

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

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

况景龙
2023-03-14

StackOverflower错误表示递归方法调用sendRequest经常被发送到,堆栈上没有剩余内存。为了更好的解释,请看什么是StackOverflowerr?首先,你可能应该检查你破坏外观的地方(在handleResponsesendRequest中)是否完全按照你的预期工作。尤其是在handleResponse中,看起来是有线的。如果一切都是这样,你可以尝试重写逻辑,使用循环而不是递归调用。

 类似资料:
  • 我需要在Freemarker中使用实体列表迭代器迭代大量记录。但是,在使用递归宏时,当它仅达到1000条记录时,就会出现StackOverflow错误。下面是同样的代码片段。

  • 使用此链接试图升级到TLSv1。2.唯一的区别是到目前为止支持所有TLS,因此使用了以下方法: 奇怪的是出现了这样的错误: 我的文件在哪里。java有这样的内容,请注意下面提到的第101行: 我的问题 > 很明显,base.createSocket递归调用它自己的方法。不明白怎么做? 无法在我的本地机器上复制,这些日志只发生在生产中。因此,我如何复制这个(使用与生产中存在的相同的Java版本,to

  • 用于图像文件: 以下是我完成的错误: java.net.socketException:sendto失败:在libcore.io.iobridge.MaybeThrowAfterSendto(Iobridge.java:586)在libcore.io.iobridge.sendto(Iobridge.java:555)在java.net.plainsockeTimpl.write(plainsoc

  • 我使用自定义授权标头对http请求进行签名: 所以这个异常不同于最初的异常。当我移除头部并禁用webservice上的授权时,连接将按预期工作。所以问题似乎出在自定义授权标头上。有什么想法吗?

  • 从数据库获取数据时出错: 那我该怎么解决呢?

  • 我编写了一个java程序来从url NSE Bhavcopy下载文件 但是我得到了“thread'main'java.net.ConnectException:Connection timed Ut:Connect”,我尝试了以下排列和组合,但没有成功。 null 以下是代码和跟踪以供参考,有人可以帮助我吗 痕迹