Хотя другие ответы правильно объясняют ситуацию с точки зрения пользователя, стоит отметить, что «умность» анализа таких потоков не на усмотрение компилятора, а точно определяется правилами JLS. В частности, §14.21 содержит это:
Оператор выражения может обычно завершаться, если он достижим.
Вызов метода, такой как throwIAE()
, является выражением-выражением, и, поскольку он достижим в примере, он также может "нормально завершаться". Из-за этого тело метода может «нормально завершаться», что в соответствии с §8.4.7 недопустимо для метода с типом возвращаемого значения, не являющегося пустым (то есть такие методы должны возвращать значение на всех возможных путях).
Другими словами, JLS определяет, что все вызовы методов обрабатываются одинаково во время анализа потока, и не существует такого понятия, как «метод, который всегда выбрасывает».