Java, библиотека Google Collections; проблема с AbstractIterator? - PullRequest
2 голосов
/ 30 ноября 2009

Я использую библиотеку Google Collections AbstractIterator для реализации генератора. При этом я столкнулся с проблемой; Я сократил его до более простого типа и воспроизвел проблему. Это сокращение, очевидно, излишне для того, что оно делает, считая от 1 до нумерации через Iterable.

По существу, в следующем коде работает незакомментированная версия, а прокомментированная - нет (обеспечивает нулевой элемент последним, а не заканчивается последним числом).

Я что-то не так делаю, или это проблема с библиотекой?

private Iterable<Integer> elementGenerator(final int numelements) {
  return new Iterable<Integer>() {
    @Override public Iterator<Integer> iterator() {
      return new AbstractIterator<Integer>(){
        int localcount=0;
        @Override protected Integer computeNext() {
          if (localcount++ == numelements) return endOfData();
          return localcount;
          // return (localcount++ == numelements) ? endOfData() : localcount;
        }
      };
    }
  };
}

Я также попытался поиграться с механизмом ?: (например, с префиксом возврата и сравнением с +1 вместо), но безрезультатно. Я немного покопался в поисках документации по этому поводу, но ничего не нашел. Очевидно, синтаксис ?: является лишь удобством, а не необходимостью, но все же ...

Ответы [ 2 ]

5 голосов
/ 30 ноября 2009

Вы получаете NullPointerException из-за использования тернарного оператора условного выражения с различными числовыми типами. Java имеет сложные правила при смешивании числовых значений различных типов в троичном выражении: JLS Section 15.25.

Учитывая, что endOfData(), как предполагается, возвращает Integer, а localcount является int, Java распаковывает значение endOfData(). Однако, учитывая, что endOfData() возвращает ноль, операция распаковки приводит к исключению нулевого указателя.

Вы можете продолжить использование оператора if или объявить localcount как Integer.

0 голосов
/ 30 ноября 2009

Полагаю, проблема в том, что вы используете оператор постинкремента в сочетании с троичным оператором. Потому что, кроме этого, два фрагмента должны быть полностью эквивалентны - и это вряд ли ошибка AbstractIterator, если они не таковы, поскольку ни один из его кодов не вызывается в этот момент.

...