Почему нулевое значение соответствует шаблону записи?
Я пробовал примеры сопоставления шаблонов с шаблонами записей в 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)
соответствие шаблону не применяется, и ничего не печатается.