Эти два на самом деле очень разные вещи. Как уже упоминали другие парни, ArrayIndexOutOfBoundsException - это исключение, которое возникает, когда вы пытаетесь получить доступ к массиву с использованием неверного индекса. Это может быть вызвано очень простой ошибкой в логике программирования.
StackOverflowError - это нечто более низкое. Это не имеет ничего общего с массивами и, вопреки тому, что сказали другие парни, также не имеет ничего общего с кучей. Попробуйте проделать этот трюк со списком, и вместо этого вы получите ошибку OutOfMemoryError. Теперь это ошибка, которая намного больше похожа на StackOverflowError, чем ArrayIndexOutOfBoundsException. И OutOfMemoryError, и StackOverflowError указывают, что вам не хватает памяти, только в разных сегментах. Из-за бесконечной рекурсии почти всегда происходит нехватка стековой памяти (если только у вас нет смехотворно длинной цепочки методов, вызывающих друг друга с большим количеством локальных переменных в них), а нехватка памяти в куче происходит, когда вы выделяете слишком много и сохраняете все эти ссылки, так что даже сборщик мусора не может освободить память для вас.
Таким образом, когда ArrayIndexOutOfBoundsException действительно «прилипает к данным, куда они не должны идти», StackOverflowError и OutOfMemoryError лучше описать как «нехватка памяти для вставки данных».