5

я получаю StackOverflowException этого метода Java:Я получаю исключение StackOverFlowException в этом коде, потому что моя JVM не поддерживает оптимизацию хвостового вызова, правильно?

private static final Integer[] populate(final Integer[] array, final int length, final int current) { 

    if (current == length) { 
     return array; 
    } else { 
     array[current] = TR.random.nextInt(); 
     System.out.println(array[current]); 
     return populate(array, length, current + 1); 
    } 
} 

Я играю с хвостом вызова рекурсией, так что я думаю, это то, что происходит, когда виртуальная машина не короткое замыкание права стеки?

ответ

7

Нет JVM, о котором я знаю, поддерживает оптимизацию хвостового вызова. Это не надзор. По-видимому, эта оптимизация имеет существенные последствия для разработчиков Java и менеджеров безопасности Java.

Ссылки:

1

Я нашел reference of tail recursion в java, поэтому я бы это проверял (позже, когда у меня есть время).

Хотя это было бы крайне неэффективно для вашего прецедента.

+0

Я не думаю, что документ добавляет много ... ссылка на хвостовую рекурсию не упоминает, оптимизированы ли ссылки на столы – Eddy

3

Да, хвост вызова оптимизации в настоящее время не поддерживается JVM из модели безопасности и необходимость всегда иметь трассировки стека доступны, этот пример можно легко переписать с помощью итерации, хотя.

+0

Привет, конечно, это может быть легко выражается с помощью цикла for ... это упражнение в конце концов;) – Eddy

 Смежные вопросы

  • Нет связанных вопросов^_^