java.lang.StackOverflowError

205
27 апреля 2018, 15:10

Существует ркурсивный вызов метода

 private synchronized void updateData() {
    List<Double> data = serialPortConnection.updateMeas();
    updateImageAndChart(data);
    waitDrawingImageAndChart();
    if (isUpdate) {
        updateData();
    }
}

Использую библиотеку jssc для соединения с COM портом. Соответственно, метод отправляет устройству значение и получает на выходе массив, однако, после 2500-3000 тыс. повторов выходит

Exception in thread "Thread-7" java.lang.StackOverflowError
at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:304)
at java.lang.StringCoding.encode(StringCoding.java:344)
at java.lang.StringCoding.encode(StringCoding.java:387)
at java.lang.String.getBytes(String.java:958)
at jssc.SerialPort.writeString(SerialPort.java:377)
at ru.app.monitoring.model.device_connection.SerialPortConnection.updateMeas(SerialPortConnection.java:87)
at ru.app.monitoring.model.drawer.Drawer.updateData(Drawer.java:72)
at ru.app.monitoring.model.drawer.Drawer.updateData(Drawer.java:99)

Так вот, как можно все-такие сделать бесконечный цикл, без таких неприятных ситуаций?

Answer 1

Ваш код - это рекурсивная функция без без базового ограничения. При каждом вызове updateData() виртуальная машина создаёт в стековой памяти кадр для хранения локальных переменных. Стековый кадр должен уничтожаться при выходе из метода, но у вас этого никогда не происходит, так как до окончания метода он вызывается ещё раз, создавая ещё один кадр, а потом ещё и ещё. Так продолжается до тех пор, пока не будет достигнуто ограничения на размер стека. В этот момент вы и получаете исключение. Для исправления этой проблемы достаточно перенести вызов метода в цикл, тогда в стеке будет создаваться только один кадр и в конце итерации уничтожаться.

private synchronized void updateData() {
    List<Double> data = serialPortConnection.updateMeas();
    updateImageAndChart(data);
    waitDrawingImageAndChart();
}
public static void main(String args[]) {  // Или другой удобный вам метод
    while(isUpdate) {
        updateData();
    }
}
READ ALSO
Сгруппировать сумму по дням

Сгруппировать сумму по дням

Необходимо написать запрос, который брал бы сумму всех проданных товаров определенного продавца за определенный период и сгруппировать...

258
Создание dll c++. Описание интерфейса. Visual Studio

Создание dll c++. Описание интерфейса. Visual Studio

Подскажите, пожалуйста, мне необходимо создать библиотеку преобразования данных в определенный формат

336
Строковый тип в switch case

Строковый тип в switch case

Можно ли написать конструктор switch case со строковым типом переменных C++ ???

226