2

我正在使用 Google Collections 库AbstractIterator来实现生成器。我这样做时遇到了问题;我已将其简化为更基本的类型并重现了该问题。这种减少对于它的作用来说显然是多余的,通过 Iterable 从 1 计数到 numelements。

基本上在下面的代码中,未注释的版本有效,而注释的版本无效(最后提供一个空元素,而不是在最后一个数字上结束)。

我做错了什么,还是图书馆的问题?

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;
        }
      };
    }
  };
}

我还尝试摆弄?:安排(例如,在 return 前加上前缀并与 +1 进行比较),但无济于事。我四处寻找有关此的文档,但没有找到任何东西。显然,?:语法只是一种方便,而不是必需品,但仍然......

4

2 回答 2

5

NullPointerException由于使用了具有不同数值类型的三元运算符、条件表达式,您会得到一个。Java在三元表达式中混合不同类型的数值时有复杂的规则:JLS Section 15.25.

考虑到endOfData()is 被返回Integer,whilelocalcount是一个int,Java 将 的值拆箱endOfData()。但是,如果endOfData()返回 null,则拆箱操作会导致空指针异常。

您可以继续使用 if 语句,也可以将 localcount 声明为Integer.

于 2009-11-30T18:55:44.043 回答
0

我预计问题在于您使用后增量运算符以及三元运算符。因为除此之外,这两个片段应该是完全等价的——如果它们不是抽象迭代器的错,那几乎不是抽象迭代器的错,因为此时没有调用它的代码。

于 2009-11-30T18:43:38.167 回答