Почему нулевое значение соответствует шаблону записи?

Я пробовал примеры сопоставления шаблонов с шаблонами записей в Java 21. Официальная документация утверждает, что нулевое значение не соответствует ни одному шаблону записи. Тем не менее, я попробую этот пример:

      record Point(Integer x, Integer y) {}

public class MainPatternMatchingRecord {
    public static void main(String[] args) {
        printSum(new Point(null, 2));
    }

    private static void printSum(Object obj) {
        if (obj instanceof Point(var x, var y)) {
            System.out.println(x + 1);
        }
    }
}

Здесь, в моем понимании JEP,new Point(null, 2)не должно совпадать вinstanceof Point(var x, var y), но при запуске программы выдает это исключение:

Исключение в потоке «main» java.lang.NullPointerException: невозможно вызвать «java.lang.Integer.intValue()», поскольку «x» имеет значение null

Почему такое поведение происходит? Как правильно интерпретировать, что нулевое значение не соответствует ни одному шаблону записи?

1 ответ

Исключение, которое вы видите, не имеет ничего общего с записями, оно вызвано строкой, которая пытается добавить одну запись вnullи ничем не отличается от вывода, который вы бы увидели, если бы объявилиInteger x = null;:

      System.out.println(x + 1);

Если вы измените эту строку наSystem.out.println("x="+x+" y="+y);тогда ваш пример кода работает нормально - сопоставлениеnew Point(null, 2)к x и y и напечатает значение, которое вы инициализировали - "x=null y=2"

      public class MainPatternMatchingRecord {
    public static void main(String ... args) {
        printSum(new Point(null, 2));
    }

    private static void printSum(Object obj) {
        if (obj instanceof Point(var x, var y)) {
            System.out.println("x="+x+" y="+y);
        }
    }
}

Если вы позвонитеprintSum(null)соответствие шаблону не применяется, и ничего не печатается.

Другие вопросы по тегам