Java рекурсия stackoverflow exception

166
14 апреля 2018, 21:39

В программе существует несколько синхронизированных потоков, каждый из них рекурсивен, и создает новый объект который содержит в себе примерно такой код:

private String getAnswer(){
    URL aURL = new URL(link);
    HttpsURLConnection conn = (HttpsURLConnection) aURL.openConnection();
    if(checkResponseCode(conn.getResponseCode())) return new BufferedReader(new InputStreamReader(conn.getInputStream())).readLine();
}

Этот код обращается по url, который передает поток, и идет к API на сайте, получает JSON string И возвращает его потоку который создал объект.

Вопрос:

1 . Рано или поздно программа вылетает с stackoverflow на моменте HttpsURLConnection conn = (HttpsURLConnection) aURL.openConnection();

Exception in thread "main" java.lang.StackOverflowError
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1139)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347)

Как исправить ошибку?

UPD: куда ведет checkResponseCode(conn.getResponseCode())

private boolean checkResponseCode(int responcecode){
        if (responcecode >= 400 && responcecode < 500 && responcecode != 429 && responcecode != 418) {
            System.out.println("BAD REQUEST");
            return false;
        }
        if (responcecode >= 500 && responcecode < 600 && responcecode != 504) {
            System.out.println("FAILED");
            return false;
        }
        switch (responcecode) {
            case 429:
                System.out.println("WARNING! REQUESTLIMIT FULL");
                return false;
            case 418:
                System.out.println("WARNING! IP BLOCK");
                return false;
            case 504:
                System.out.println("WARNING!FAILED");
                return false;
            case 200:
                return true;
            default:
                System.out.println("Ops. Help me! I don't know what i do now!");
                return false;
        }
    }
Answer 1

Итак ответ: default locale и Никита Гордеев были правы, вместо того чтобы делать вечную рекурсию(по задумке), в java это необходимо сделать циклом, и тогда ошибки переполненного стека не будет.

READ ALSO
Java - Записать куки на все пути URL

Java - Записать куки на все пути URL

В сервлете по URL - /user/registration регистрирую пользователя и записываю в его браузер куки

173
Прозрачный фон у WebView

Прозрачный фон у WebView

Нужно сделать прозрачный фон у WebView в JavaFX

194
За что отвечает ACCESS_MOCK_LOCATION

За что отвечает ACCESS_MOCK_LOCATION

Добрый день уважаемые! В манивесте приложения содержится следующее разрешение :

211
Работа с JNI в Intellij Idea (TDlib)

Работа с JNI в Intellij Idea (TDlib)

Возникли проблемы с тем, как добавлять в свой проект в среде Idea C/C++ библиотеки, в частности, TDlibРаботаю на Ubuntu 16

287