Метод не всегда требуется для возврата значения;в частности, ему также разрешается выход, выдавая исключение (в этом случае значение не возвращается).
Редактировать: В частности, правила для тела метода, которые возвращают int
:
- Все операторы
return
в методе должны возвращать выражение, конвертируемое в int
- Конец блока метода не долженбыть достижимым
В вашем примере компилятор может доказать, что M2
всегда завершается с помощью броска, поэтому конец блока метода недоступен (удовлетворяет правилу № 2).Также нет операторов return
, что также удовлетворяет правилу № 1.Следовательно, это правильное определение метода.
С другой стороны, M1
не удовлетворяет правилу # 2, поэтому оно недопустимо.
Возможно, вас вводит в заблуждение сообщение об ошибке, котороене упоминать throwing вообще, но учтите, что почти во всех случаях методы с возвращаемыми значениями делают return
вместо throw - компилятор просто говорит, что вы хотите, чтобы вы, вероятно, забыли сделать.