Блок catch (IOException) не перехватывает исключение, поскольку InvalidStartingStonesException не является ни IOException, ни его потомком.
Ваше исключение является непроверенным исключением , как и IllegalArgumentException. Компилятор не обязывает программиста отлавливать такие исключения, поскольку они обычно представляют ошибки, а не ситуации, которые могут быть обработаны.
Поскольку исключение не перехватывается, оно распространяется до конца стека вызовов основного потока, пока ваша программа не завершится.