Какое условие выбрасывания StackOverflowError?
Ну очевидно, что у компилятора есть максимально допустимый размер стека вызовов.
При вызове функции в стек кладется определенный набор данных. При обычной (не хвостовой) рекурсии, каждый вложенный вызов функции будет увеличивать стек на N байт. В определенный момент (в какой именно - зависит от нескольких факторов, в их числе количество и типы параметров функции, макс. размер стека) стеку будет расти некуда, и вывалится эта ошибка.
В дополнение к предыдущему ответу - есть параметр -XX:MaxJavaStackTraceDepth=1024. Т.е. если размер стека вызовов превысит 1024, будет брошен StackOverflowError. По умолчанию выставлено 1024. Но это, как уже было сказано, не единственная возможная причина возникновения данного исключения.