Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Используя @SuppressWarnings
везде, как предложено, хороший способ сделать это, хотя это действительно включает немного пальца, вводящего каждый раз, когда Вы звоните q.list()
.
существует два других метода, которые я предложил бы:
Запись помощник броска
Просто осуществляют рефакторинг весь Ваш @SuppressWarnings
в одно место:
List<Cat> cats = MyHibernateUtils.listAndCast(q);
...
public static <T> List<T> listAndCast(Query q) {
@SuppressWarnings("unchecked")
List list = q.list();
return list;
}
Препятствуют тому, чтобы Eclipse генерировал предупреждения для неизбежных проблем
В Eclipse, перейдите к Окну> Предпочтения> Java> Компилятор> Ошибки/Предупреждения и под Универсальным типом, выберите флажок Ignore unavoidable generic type problems due to raw APIs
, Это выключит ненужные предупреждения для подобных проблем как та, описанная, выше которого неизбежны.
Некоторые комментарии:
Query
вместо результата q.list()
, потому что тот способ, с которым этот метод "обмана" может только использоваться для обмана, в спящем режиме, а не для обмана любого List
в целом. .iterate()
и т.д. Решение Joe Dean выглядит интересным, но Вы думаете, что это стоит того - создают новый Список и цикл через все элементы только для избавлений от предупреждений?
(извините, не может добавить комментарий непосредственно к его решению по некоторым причинам)
Если Вы не хотите использовать @SuppressWarnings ("снял флажок") с Вами, может сделать следующее.
Query q = sess.createQuery("from Cat cat");
List<?> results =(List<?>) q.list();
List<Cat> cats = new ArrayList<Cat>();
for(Object result:results) {
Cat cat = (Cat) result;
cats.add(cat);
}
к вашему сведению - я создал util метод, который делает это для меня так, он не замусорил мой код, и я не должен использовать @SupressWarning.
У нас была та же проблема. Но это не было грандиозное предприятие для нас, потому что мы должны были решить другое больше главных проблем с, в спящем режиме Запрос и Сессия.
Конкретно:
Так для нас, мы имеем:
методов и возвратов И наконец,
, AmplafiQuery имеет "asList ()", который является универсальной включенной версией Query.list (), AmplafiQuery имеет "уникальный ()", который является универсальной включенной версией Query.uniqueResult () (и просто регистрирует проблему вместо того, чтобы выдать исключение)
, Это - большая работа для того, чтобы просто избежать @SuppressWarnings. Однако как я сказал (и перечислил) существует многое из другого лучше! причины сделать переносящуюся работу.
Нет, но можно изолировать его в определенные методы запроса и подавить предупреждения с @SuppressWarnings("unchecked")
аннотация.
Это не контроль или ошибка. Предупреждение отражает реальную базовую проблему - нет никакого способа, которым компилятор Java может действительно быть уверен, что быть в спящем режиме класс собирается сделать, это - задание правильно и что список, который это возвращает, будет только содержать Кошек. Любое из предложений здесь прекрасно.
В нашем коде мы аннотируем вызывающие методы:
@SuppressWarnings ("снял флажок")
, я знаю, что он походит на взлом, но co-разработчик, проверенный недавно и, нашел, что это было всем, что мы могли сделать.
Мы используем @SuppressWarnings("unchecked")
также, но мы чаще всего пытаемся использовать его только на объявлении переменной, не на методе в целом:
public List<Cat> findAll() {
Query q = sess.createQuery("from Cat cat");
@SuppressWarnings("unchecked")
List<Cat> cats = q.list();
return cats;
}