Optional.of(null).orElse();
Очевидно, что приведенный выше код всегда будет вызывать исключение. Но как насчет:
Optional.of(someMethod()).orElse();
с
Object someMethod() { return null; }
Вы, наверное, думаете: конечно, то же самое.
Ну, на самом деле это не так. Что, если подкласс переопределяет someMethod()
для возврата значения, отличного от null
?! Таким образом, вы не можете решить в время компиляции , будет ли этот метод всегда возвращать ноль в время выполнения .
Короче говоря: существует множество очевидных, а также менее очевидных ситуаций, когда компилятор может применять все виды методов, таких как анализ потока данных, чтобы определить,код будет приводить к исключению времени выполнения или нет. Но есть и много других, где это невозможно.
Суть здесь: люди, определяющие язык, должны определить, что, как они ожидают, будут заботиться компиляторы.
Люди из Java выбрали простой компилятор. Тот, который компилируется быстро и не слишком сложен для реализации. Почему? Потому что компилятор просто избегает слишком сложной проверки.