Распаковывание Несуществующего объекта к типу примитива приводит к NullPointerException, прекрасному?

Этот отрывок бросает NullPointerException вследствие того, что его распакованный к типу примитива и Long.longValue() назван, правильно?

Это даже легко видеть, есть ли у Вас отрывок как это:

long value = (Long) null;

Но NullPointerException еще более твердо войти в более сложную такую ситуацию:

long propertyValue = (Long) obj.getProperty(propertyModel.getName());

Так нет ли никакая возможность для Компилятора Java для создания более удобного Исключения из этого? Я предпочел бы IllegalArgumentException с сообщением как "Вы пытаетесь бросить несуществующий объект в тип примитива, это не может быть сделано!"

Разве это не было бы более соответствующим? Что Вы думаете? Это даже возможно во времени выполнения? Могут мы для определения этого броска? Я еще не посмотрел на байт-код Java. Возможно, это могло использоваться в решении.

На этот вопрос можно ответить: я хотел бы знать, возможно ли достигнуть этого поведения!

38
задан Ivan Zelenskyy 14 November 2018 в 09:41
поделиться

2 ответа

Согласно спецификации языка Java, распаковка происходит через вызов Number.longValue(), Number.intValue() и т.д. При этом не происходит никакой особой магии байт-кода, все точно так же, как если бы вы вызывали эти методы вручную. Таким образом, NullPointerException является естественным результатом раскрытия null (и фактически предписывается JLS).

Выбрасывание другого исключения потребовало бы проверки на null дважды во время каждого преобразования unboxing (один раз, чтобы определить, нужно ли выбрасывать специальное исключение, и один раз неявно, когда метод действительно вызывается). Полагаю, разработчики языка не сочли это достаточно полезным, чтобы оправдать это.

72
ответ дан 27 November 2019 в 03:22
поделиться

Это не то, что означает IllegalArgumentException . Компилятор не гарантирует, что значение будет null до времени выполнения. Все, что он знает, это тип, который в вашем примере, скорее всего, будет String .

Конечно, во время выполнения, когда возникает исключение, компилятор знает, что проблема заключается в нулевом значении. Вы можете убедиться в этом сами, если используете отладчик. Итак, с технологической точки зрения - и вот краткий ответ на ваш вопрос - да, было бы возможно создать компилятор, который включит это в описание ошибки. Но если вам нужно специальное сообщение для значений null , что дальше? Специальные сообщения для целых чисел, которые выходят за рамки допустимого диапазона более 10? По общему признанию, это своего рода глупый пример, но я надеюсь, что он иллюстративный.

1
ответ дан 27 November 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: