Новое исключение Nullpointer в Java 17
Источник: Dev.to Каждому Java-разработчику стоит знать о существовании в Java 17 нового исключения Nullpointer Exception или NPE. Это одна из таких ситуаций, которую всегда нужно стараться предотвратить. Иногда Nullpointer означает, что необходима отладка кода, чтобы найти небольшую ошибку.
java.lang.NullPointerException: null
Конечно, это далеко не все, что вам нужно знать о трассировке стека. Как видите, тут не указано, где и почему возникло это исключение.
Посмотрите, как с этой проблемой справляется Java 17:
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
В этом примере исключение указывает, где и какова наша ссылка на нулевой объект.
Вот так просто!
Что означает <T> в Java?
Источник: Dev.to <T> — это обычная буква, обозначающая “Type”, и она относится к концепции Generic в Java. Вы можете использовать для этого и другую букву, но, как можно заметить, буква T более предпочтительна.
Что такое Generic?
Generic — это способ параметризации класса, метода или интерфейса. Давайте посмотрим на пример дженерика:
package Generics;
class House<T>{
T doorNumber;
public House(T doorNumber) {
this.doorNumber = doorNumber;
}
public void print(){
System.out.println("Your house number is: " + this.doorNumber);
}
}
- У нас есть класс под названием House, который может принимать произвольный тип объекта.
- Далее у нас есть поле с именем doorNumber, которое также может принимать любой тип объекта.
- В конце мы объявляем параметризованный конструктор и выводим номер двери.
public class GenericsExample {
public static void main(String[] args) {
House<String> mainHouse = new House<>("14a");
mainHouse.print();
}
}
Результат получится таким:
Your house number is: 14a
Мы заменим букву “Т” на “String” и введем номер дома в конструктор.
Мы можем использовать несколько типов, если, например, нам нужно, чтобы класс принимал более одного объекта. Можно добавить еще одну букву и тем самым сказать: мы хотим, чтобы класс принял другой Generic.
package Generics;
class House<T, V>{
T doorNumber;
V streetName;
public House(T doorNumber, V streetName) {
this.doorNumber = doorNumber;
this.streetName = streetName;
}
public void print(){
System.out.println("You live at: " + this.doorNumber + " " + this.streetName);
}
}
public class GenericsExample {
public static void main(String[] args) {
House<Integer, String> mainHouse = new House<>(14, "Tellson Avenue");
mainHouse.print();
}
}
Результат будет таким:
You live at: 14 Tellson Avenue
До сих пор мы видели примеры использования Generic на уровне класса. Но у нас также могут быть общие методы и интерфейсы.
Метод Generic
package Generics;
class House{
public <T> void print(T doorNumber){
System.out.println("You live at house number: " + doorNumber);
}
}
public class GenericsExample {
public static void main(String[] args) {
House mainHouse = new House();
mainHouse.<Integer>print(14);
}
}
Метод принимает любой тип объекта и выводит номер двери, который будет любым типом Object. В этом случае мы хотим, чтобы метод принимал целое число.
Результат будет:
You live at house number: 14
Интерфейс Generic
Сначала создайте интерфейс.
package Generics;
interface Property<T>{
void hasBalcony(T balcony);
}
Затем реализуйте интерфейс.
package Generics;
public class House implements Property<String> {
@Override
public void hasBalcony(String balcony) {
System.out.println("Is there a balcony in the room? " + balcony);
}
public static void main(String[] args) {
House mainHouse = new House();
mainHouse.hasBalcony("YES");
}
}
Результат:
Is there a balcony in the room? YES
Каковы преимущества использования дженериков?- Лучшая проверка во время компиляции: если вы используете тип объекта, отличный от того, который вы указали, компилятор сообщит вам об этом.
- Возможность повторного использования: вы можете использовать класс, метод или интерфейс несколько раз, потому что вы решаете, какой тип объекта применять в зависимости от того, чего вы пытаетесь достичь.
- Он отлично подходит для структур данных и алгоритмов: ArrayList и HashMap — это лишь несколько примеров, где используется Generic.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ