Почему метод get параметра generi c генерирует исключение NullPointerException - PullRequest
0 голосов
/ 10 января 2020

У меня есть этот простой Java класс, и я просто пытаюсь передать тип, но я всегда получаю исключение Nullpointer, потому что null, очевидно, является нулевым, ПОЧЕМУ?

public class Main {

    public static void main(String[] args) {

    Box<String> test = new Box<>();
    test.print();
    }


//And the Generic Class
public class Box<T> {
    // T stands for "Type"
    private T t;

    public void set(T t) { this.t = t; }
    public T get() { return t; }

    public void print () {

        System.out.println(this.t.getClass());
    }
}

Использование JDK 12

Ответы [ 4 ]

2 голосов
/ 10 января 2020

Вы получаете NullPointerException, поскольку ссылка на переменную t равна нулю. Вы пытаетесь получить доступ к переменной до ее инициализации. Во-первых, вызовите метод setter. Затем попробуйте получить его.

NullPointerException: NullPointerException Брошенный, когда приложение пытается использовать ноль в случае, когда требуется объект.

Вот решение

Box<String> test = new Box<>();
test.set("hi!");
test.print();
1 голос
/ 10 января 2020

Вы только новый объект Box<String>, однако вы не инициализировали private T t;, попробуйте что-то вроде этого

Box<String> test = new Box<>();
test.set("the first way");
test.print();

или

public class Main {

public static void main(String[] args) {

Box<String> test = new Box<>("the second way");
test.print();
}


public class Box<T> {
// T stands for "Type"
private T t;

public void set(T t) { this.t = t; }
public T get() { return t; }
public Box(T t) {this.t = t}
public void print () {

    System.out.println(this.t.getClass());
}

}

1 голос
/ 10 января 2020

Хотя все остальные ответы объясняют, почему вы получаете NullPointerException, ясно, что вы хотите, так или иначе, получить String бит вашего выражения Box<String>.

Вы не можете ; это называется стиранием. Обобщения в выражениях и объявлениях локальных переменных являются плодом воображения компилятора; это проверенные компилятором комментарии. Нравится комментарии. они перестают существовать во время выполнения.

Обобщения в подписи (таким образом, методы, возвращающие типы, типы параметров, типы полей и любые обобщения, упомянутые где-либо в строке объявления вашего класса, поэтому A, B и C в class Foo<A> extends Parent<B> implements Something<C>) восстанавливаются с помощью какого-то очень хитрого и странного API (и я думаю, вы действительно не хотите этого).

Если вы должны иметь возможность доступа к одному простые типы, я предлагаю передать фактический объект класса: new Box<String>(String.class).

0 голосов
/ 10 января 2020

Вы только инициализируете свой объект Box<String>, но вы не установили переменную экземпляра T t на что-либо.

Поскольку T является объектом, его значение по умолчанию будет нулевым.

Попробуйте сначала установить его, затем вызвать print.

Box<String> test = new Box<>();
test.set("test");
test.print();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...