В чем причина нулевых проверок при оценке выражения ссылки на метод? - PullRequest
0 голосов
/ 12 декабря 2018

Существует множество вопросов, в которых люди поняли, что создание ссылки на метод с выражением, которое оценивается как значение null, приведет к NullPointerException.Например:

String s = null;
Supplier<char[]> fun = s::toCharArray;

Это связано со следующим абзацем в спецификации java:

Во-первых, если выражение ссылки на метод начинается с ExpressionName или Primary, этоподвыражение оценивается.Если подвыражение имеет значение null, возникает исключение NullPointerException, и выражение ссылки на метод завершается преждевременно.Если подвыражение завершается внезапно, то выражение ссылки на метод завершается преждевременно по той же причине.

Теперь мой вопрос: кто-нибудь случайно знает причину этого (основываясь на многих запутанных вопросах), противоречащих интуиции?спецификация была / есть?

Единственное, что мне приходит в голову, это то, что в следующем случае трудно точно сообщить об ошибке NullPointerException, если она произошла во время оценки Supplier:

public static char[] callback(Supplier<char[]> supplier) {
    return supplier.get();
}

public static void main(String[] args) {
    String s = null;
    callback(s::toCharArray);
}

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Поскольку компилятор Java не является средством проверки линтеров / логики.
Ничто в Java не препятствует запуску NPE путем разыменования null.
Например, Java не мешает вам делать:

String s = null;
s.toString();

Это верно перед Java 8 и верно и сегодня для ссылок на методы.

В абзаце, который вы цитируете, просто объясняется, как во время выполнения JVM обрабатывает эту точку для ссылок на методы, то есть если в части оценки ссылок на метод происходит сбой, вся оценка завершается неудачей.

Обратите внимание, что в вашем реальном примере ваша IDE, вероятно, выдаст предупреждение, поскольку область потенциальной ошибки очень ограничена.

0 голосов
/ 12 декабря 2018

Причина в том, что при создании ссылки на нестатический метод он должен иметь доступ к this.Когда вы пытаетесь создать ссылку на нулевой объект, нигде нет this, поэтому на этом шаге он должен потерпеть неудачу, а не где-то дальше в коде, когда он используется впервые.

Представьте, что в одном месте вы получаете объект, где-то сохраняете ссылку на его метод, а затем используете его в совершенно другой части кода.Вы получите NPE не в том месте, где была допущена ошибка, а на расстоянии многих строк кода.

...