Null Pointer Exception и способы борьбы с ним
В Java существует два типа переменных: ссылочные и примитивные. Ссылочная переменная хранит внутри себя ссылку на объект (номер ячейки памяти), а примитивная переменная само значение.
При объявлении примитивной переменной типа int в нее проставится просто 0 (первая строка). Если же указать какое-то значение, то оно запишется в эту переменную (вторая строка).
int x;
x = 5;
С ссылочным типом ситуация обстоит немного иначе. При объявлении ссылочной переменной типа Integer, в ней изначально будет содержаться null.
Integer sampleInteger;
Null означает, что переменная ни на что не ссылается. Если же создать объект, используя ключевое слово new, то Java присвоит переменной sampleInteger его адрес в памяти.
Когда возникает Null Pointer Exception
Null Pointer Exception (NPE) - это исключение, которое говорит о том, что переменная содержит в себе значение null, а логика программы подразумевает собой, то, что она должна быть проинициализирована. Например, если передать в метод getStringLength значение null, то возникнет NPE. Так как у параметра метода значение null, то просто не у чего измерять длину и возникает исключение.
public int getStringLength(String str) {
return str.length();
}
getStringLength(null);
Способы борьбы с Null Pointer Exception
1) Добавить проверку на null и обработать ее так, как вам необходимо.
public static int getStringLength(String str) {
if (str == null) {
throw new IllegalArgumentException("str can't be null");
}
return str.length();
}
2) Использовать класс Optional. В данном примере он посчитает длину строки, а если она будет null, ты он выбросит IllegalArgumentException.
public static Integer getStringLength(String str) {
return Optional.ofNullable(str)
.orElseThrow(() -> new IllegalArgumentException("str can't be null"))
.length();
}
3) Использовать аннотацию @NotNull. Эта аннотация не избавит от NPE, у ней одна задача проинформировать о том, что метод не должен принимать null.
public static Integer getStringLength(@NotNull String str) {
return str.length();
}