Java,Google Collections Library; AbstractIterator有问题吗?

我正在使用Google Collections库AbstractIterator来实现生成器.我这样做时遇到了一个问题;我把它缩小为更基本的类型并重现了这个问题.这种减少对于它的作用显然有点过分,通过Iterable从1计算到数字.

基本上在下面的代码中,未注释的版本起作用,而注释的版本不起作用(最后提供一个null元素,而不是以最后一个数字结尾).

我做错了什么,或者这是图书馆的问题?

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),但无济于事.我捅了一下寻找关于这个的文档,但没有找到任何东西.显然,?:语法只是一种方便,不是必需品,但仍然……

解决方法:

由于使用了具有不同数值类型的三元运算符条件表达式,因此会出现NullPointerException.当在三元表达式中混合不同类型的数值时,Java具有复杂的规则:JLS Section 15.25.

鉴于endOfData()的前提是返回Integer,而localcount是一个int,Java将取消装箱的endOfData()值.但是,如果endOfData()返回null,则取消装箱操作会导致空指针异常.

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

上一篇:“只能迭代” Python错误


下一篇:Data Guard 知识 (来自网络)