Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Как всегда, часто задаваемые вопросы о генераторах Java-генератора Angelika Langer подробно объясняются . (Прокрутите к «Почему компилятор иногда выдает предупреждение без предупреждения при вызове метода« varargs »?» - идентификатор не работает хорошо.)
В принципе, вы в конечном итоге теряете информацию в худшем чем обычно. Еще одна небольшая болевая точка в Java-дженериках: (
Второй аргумент Class<? extends A>
..., который должен расширять класс, который имеет первый аргумент (например, аргумент one является Question
, поэтому вторым аргументом является то, что расширяет Question
.
Breakdown: NastyThingsToClasses(Object.class, Question.class, SomeQuestion.class); // OK
Все расширяет Object
, поэтому второй аргумент верен.
NastyThingsToClasses(Question.class, SomeQuestion.class); // OK
SomeQuestion
расширяет Question
, поэтому это справедливая игра.
NastyThingsToClasses(Question.class, Object.class, SomeQuestion.class);
Object
не расширяет Question
, следовательно, ошибка.
надеюсь, что очистил вещи.
-Brett
Ответ Джона Скита (конечно) правильный; Я немного расширю его, указав, что вы можете избавиться от этого предупреждения, с большим «если». Вы можете избежать этого предупреждения, если вы согласны с тем, что ваш проект построен с использованием Java 7.
Боб Ли написал предложение , чтобы это предупреждение было подавлено при описании метода сайт, а не сайт использования, как часть Монеты проекта .
Это предложение было принято для JDK7 (хотя синтаксис слегка изменился до @SuppressWarnings("varargs")
); вы можете, если вам интересно, посмотреть на сообщение, которое добавило эту поддержку JDK .
Не обязательно полезно для вас, но я думал, что сделаю это отдельный ответ, так что он живет для будущих читателей, которым может посчастливиться жить в мире после Java-7.
Мое решение этой проблемы состояло в том, чтобы
class Nastier {
private final Class<A> parent;
public Nastier(Class<A> parent) {
this.parent = parent;
}
public <A, C extends A> Nastier do(Class<? extends A> clazz) {
System.out.println(clazz);
return this;
}
}
public static void main(String[] args) {
Nastier nastier = new Nastier(Object.class);
nastier.do(Question.class).do(SomeQuestion.class).do(NotQuestion.class);
}
I верьте, что код выглядит чистым, и я счастлив ....:)
do
является ключевым словом и не может быть именем метода :-)
– Brad Cupit
10 June 2013 в 19:31
В стороне, предупреждение теперь можно подавить с помощью новой аннотации @SafeVarargs Java 7.
@SafeVarargs
public static <A> void func( Class<A> parent, Class<? extends A>... classes ) {
// Do func...
}