2

GoogleコレクションライブラリAbstractIteratorを使用してジェネレーターを実装しています。そうしているときに問題に遭遇しました。より基本的なタイプに減らして、問題を再現しました。Iterableを介して1からnumelementsまで数えると、この削減は明らかにやり過ぎです。

基本的に、次のコードでは、コメントされていないバージョンは機能しますが、コメントされたバージョンは機能しません(最後の番号で終わるのではなく、最後に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と比較しました)、無駄になりました。これに関するドキュメントを少し探しましたが、何も見つかりませんでした。明らかに、?:構文は便利であり、必要ではありませんが、それでも...

4

2 に答える 2

5

NullPointerException数値型が異なる三項演算子、条件式を使用しているため、 が得られます。三項式で異なる型の数値を混在させる場合、Java には複雑な規則がありますJLS Section 15.25

endOfData()を返すように受信されたInteger場合、localcountは でありint、Java は の値をボックス化解除しますendOfData()。ただし、それendOfData()が null を返す場合、ボックス化解除操作は null ポインター例外になります。

if ステートメントを引き続き使用するか、 localcount を として宣言することができますInteger

于 2009-11-30T18:55:44.043 に答える
0

三項演算子と組み合わせてポストインクリメント演算子を使用すると問題が発生すると思います。それを除けば、2 つのスニペットは完全に同等である必要があるためです。その時点でコードが呼び出されていないため、そうでない場合でも、AbstractIterator のせいではありません。

于 2009-11-30T18:43:38.167 に答える