Выдержка из ответа на аналогичный вопрос ...
Параметры и локальные переменные размещаются в стеке (со ссылочными типами объект живет в куче ипеременная ссылается на этот объект).Стек обычно располагается в верхнем конце вашего адресного пространства и по мере его использования он направляется к нижней части адресного пространства (т. Е. К нулю).
У вашего процесса также есть куча, которая находится нанижний конец вашего процесса.По мере выделения памяти эта куча может увеличиваться в направлении верхнего края вашего адресного пространства.Как видите, существует вероятность того, что куча «столкнется» со стеком (немного похоже на техтонические пластины !!!).
Ошибка переполнения стека означает, что стек (ваш метод) переполнен (выполнялся сам столько раз, что падал).Ошибки переполнения стека обычно возникают из-за неправильного рекурсивного вызова.
Как правило, если в имени вашего метода нет ключевого слова void
, убедитесь, что значение return
не совпадает со значениемназвание методаВ противном случае стек переполнится, что приведет к сбою вашей программы.Просто замените эти строки:
Math.sin(x);
return sin(x);
... этой строкой ...
return Math.sin(x);
... и вам будет хорошо идти!
ИногдаМожет быть немного сложно определить, когда произойдет сбой программы:
Q: Произойдет ли сбой этой программы?Если да, то почему?
public void MultiplyByNintyNine(byte num) {
MultiplyByNintyNine(num * 99);
}
A: На самом деле это может привести к сбою по двум причинам:
Число может стать настолько большим, чтоJVM не может справиться с этим.
Функция может вызывать себя столько раз, что JVM падает (то есть ошибка переполнения стека).
Последний случай является более разумным;хотя метод на самом деле ничего не делает return
, метод по-прежнему вызывается.
В некоторых случаях вполне нормально return
имя метода.Просто убедитесь, что у вас есть условие завершения, если вы это сделаете!Вот пример, похожий на ваш (который не падает):
import java.io.*;
//class declaration here
public static void main(String[] args) {
System.out.println(guessTheNumber());
}
public String guessTheNumber() {
int guess;
System.out.print("Guess the number:_");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
guess = Integer.parseInt(br.readLine());
} catch (NumberFormatException e) {
System.err.println("You didn't guess a number.");
guessTheNumber();
} catch (IOException e) {
System.err.println("An unexpected error occured. Please try again.");
guessTheNumber();
}
if (guess == 4) {
return "YAY! You get a prize!";
} else {
System.err.println("WAAHH! You get to guess again!");
guessTheNumber();
}
}
Предупреждение: Единственный способ остановить этот код (из самого кода) - ввести 4
.
В приведенном выше случае условие завершения возникает, когда пользователь вводит фактическое число, и это число равно 4.
PS Если вы вот ошибка REAL StackOverFlow!