Почему компилятор создает эту ошибку, использует непроверенные или небезопасные операции? [Дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

26
задан Mike Nakis 15 May 2015 в 20:03
поделиться

6 ответов

Как всегда, часто задаваемые вопросы о генераторах Java-генератора Angelika Langer подробно объясняются . (Прокрутите к «Почему компилятор иногда выдает предупреждение без предупреждения при вызове метода« varargs »?» - идентификатор не работает хорошо.)

В принципе, вы в конечном итоге теряете информацию в худшем чем обычно. Еще одна небольшая болевая точка в Java-дженериках: (

34
ответ дан Nicole 19 August 2018 в 17:25
поделиться
  • 1
    – Tom Hawtin - tackline 22 June 2010 в 21:19
  • 2
    О'КЕЫ Чтец ответил мне. Отличная ссылка. Спасибо. – Chris 22 June 2010 в 21:34
  • 3
    @Tom: Да, это, безусловно, решило бы этот конкретный. Конечно, массивы и дженерики все равно будут болью :) – Jon Skeet 22 June 2010 в 23:01
  • 4
    по крайней мере, способ обойти этот конкретный кусочек уродства, в конце концов (см. мой ответ) – Cowan 23 June 2010 в 03:39

Второй аргумент 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

0
ответ дан Brett 19 August 2018 в 17:25
поделиться
  • 1
    ОП спрашивал о предупреждениях первых двух строк, а не об ошибке. – True Soft 22 June 2010 в 21:18
0
ответ дан Chris 19 August 2018 в 17:25
поделиться

Ответ Джона Скита (конечно) правильный; Я немного расширю его, указав, что вы можете избавиться от этого предупреждения, с большим «если». Вы можете избежать этого предупреждения, если вы согласны с тем, что ваш проект построен с использованием Java 7.

Боб Ли написал предложение , чтобы это предупреждение было подавлено при описании метода сайт, а не сайт использования, как часть Монеты проекта .

Это предложение было принято для JDK7 (хотя синтаксис слегка изменился до @SuppressWarnings("varargs")); вы можете, если вам интересно, посмотреть на сообщение, которое добавило эту поддержку JDK .

Не обязательно полезно для вас, но я думал, что сделаю это отдельный ответ, так что он живет для будущих читателей, которым может посчастливиться жить в мире после Java-7.

12
ответ дан Cowan 19 August 2018 в 17:25
поделиться

Мое решение этой проблемы состояло в том, чтобы

  1. создать класс Nastier
  2. удалить ... из doNastyThingsToClasses
  3. make doNastyThingsToClasses none static method
  4. сделать имя коротким, например do
  5. вернуть это
  6. переместить повторяющиеся аргументы в свойства класса
    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 верьте, что код выглядит чистым, и я счастлив ....:)

5
ответ дан LuisKarlos 19 August 2018 в 17:25
поделиться
  • 1
    Я не думал о цепочке методов ... это действительно хороший обходной путь! – Chris 13 October 2011 в 22:29
  • 2
    Nitpicking, но 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...
}
8
ответ дан Scott 19 August 2018 в 17:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: