Объявление класса вызывает исключение нулевого указателя - PullRequest
0 голосов
/ 27 марта 2012

Моя программа падает из-за исключения нулевого указателя.

Отрывок трассировки стека:

java.lang.NullPointerException
at com.my.GRTRecTimeSortComparator.compare(SourceFile:15)

Это хорошо и хорошо.Но моя проблема в том, что строка 15 является объявлением класса:

15 public class GRTRecTimeSortComparator   implements Comparator<GRTRecord> {
16    @Override
17    public int compare(GRTRecord rec1, GRTRecord rec2) {
18      
19      int returnVal=rec1.getRecordCalendar().compareTo(rec2.getRecordCalendar());
20        return returnVal;
21    }
22}

Она вызывает функцию сравнения, но я также не вижу проблемы с этим.Каждой записи также присвоен уникальный календарь.

Есть идеи?Что я здесь не так сделал?

Редактировать: в ответ на запросы:

Нет, в самом классе нет ничего странного, кроме того факта, что я его написал.

Я использую Proguard.Может быть, Обфускация заменяет вещи неправильно?

Я сейчас пишу тесты для записей.Они НЕ ДОЛЖНЫ быть null, равно как и Calendars;Я использую их непосредственно раньше и получаю хорошие результаты.

Может быть, я просто неправильно передаю ArrayList.

РЕДАКТИРОВАТЬ 2:

Регистрация строк, вставленных в классникогда не беги.Независимо от того, что я добавляю или делаю с классом, нулевой указатель всегда разрешается в строке объявления класса.

Удалено запутывание Proguard, и все еще нет игральных костей.

Я ДЕЙСТВИТЕЛЬНО расстроен.

Редактировать 3:

Для будущих пользователей:

Proguard разрушает вашу трассировку стека.Это было причиной вышесказанного.Удалите proguard, если вы столкнулись с проблемами.

Причина была на самом деле поврежденной записи в наборе данных.

Ответы [ 5 ]

1 голос
/ 27 марта 2012

Я сильно подозреваю, что отладочная информация просто не синхронизирована. Поставьте вход в ваш метод compare. Я бы вошел (по порядку):

  • rec1
  • rec2
  • rec1.getRecordCalendar()
  • rec2.getRecordCalendar()

Если это не проблема, есть ли что-нибудь «странное» в классе каким-либо другим способом? Например:

  • Вы используете Hibernate или что-то подобное, что может создавать прокси для вас?
  • Это внутренний класс?
1 голос
/ 27 марта 2012

Возможно, вы захотите попробовать проверить нулевые значения rec1 и rec2 на полноту

1 голос
/ 27 марта 2012

В такие моменты хорошо, если ваш отладчик работает с ошибкой.Вы будете точно знать, где находится ваш NPE.

0 голосов
/ 10 сентября 2012

ProGuard старается максимально сохранить информацию об отладке, но это не всегда технически возможно.Например, если метод getRecordCalendar становится встроенным, любые исключения, которые выбрасывает метод, теперь генерируются с сайта вызова.

0 голосов
/ 08 сентября 2012

Если вы реализуете интерфейс компаратора, вы можете использовать только метод compare(), но вы пытаетесь получить доступ к compareTo() методу сопоставимого, который вы не реализовали.В вашей программе:

Значение сравнения возвращается в виде справочной формы, которую нельзя вернуть к примитивному типу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...