Создание ссылки метода на нулевой ссылке не вызывает исключения

Есть ли причина, по которой можно создавать ссылки на методы на null ссылка в Java? Выполнение этого, вероятно, никогда не будет правильным, но может привести к ошибкам, которые трудно найти позже:

public class Test {
    void m() {
    }

    public static void main(String[] args) {
        Test test = null;
        Runnable fn = test::m; // no exception
        System.out.println(fn); // prints Test$$Lambda$1/[email protected]
        fn.run(); // throws a null pointer exception
    }
}

Ответ 1

Есть ли причина, по которой можно создавать ссылки на методы с помощью ссылки null в Java?

Это не, но, видимо, там есть ошибка в Eclipse (редактирование: с тех пор как исправлено). Согласно спецификации, и когда вы используете инструменты JDK, она не работает с NPE в строке Runnable fn = test::m;.

Доказательство: http://ideone.com/APWXna (или компилировать и запускать его локально с помощью javac и java, а не Eclipse)

Теория: От JLS §15.13.3:

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

(Мой акцент.)