使用HTTPUrlConnection时的StackOverflowError

时间:2015-09-29 10:54:54

标签: java sockets stack-overflow httpurlconnection

我在使用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;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

StackOverflowError表示您经常发送sendRequest的递归方法调用,并且堆栈上没有剩余内存。 有关一个很好的解释,请参阅What is a StackOverflowError? 首先,你应该检查一下你看起来的地方(handleResponsesendRequest是否完全按预期工作。特别是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。