В программе существует несколько синхронизированных потоков, каждый из них рекурсивен, и создает новый объект который содержит в себе примерно такой код:
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;
}
}
Итак ответ: default locale и Никита Гордеев были правы, вместо того чтобы делать вечную рекурсию(по задумке), в java это необходимо сделать циклом, и тогда ошибки переполненного стека не будет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
В сервлете по URL - /user/registration регистрирую пользователя и записываю в его браузер куки
Добрый день уважаемые! В манивесте приложения содержится следующее разрешение :
Возникли проблемы с тем, как добавлять в свой проект в среде Idea C/C++ библиотеки, в частности, TDlibРаботаю на Ubuntu 16