Question

J'utilise la bibliothèque Google Collections AbstractIterator pour implémenter un générateur. J'ai rencontré un problème en le faisant; Je l'ai réduit à un type plus fondamental et reproduit le problème. Cette réduction est manifestement excessive pour ce qu'elle fait, de 1 à numelements via un Iterable.

Essentiellement, dans le code suivant, la version non commentée fonctionne et la version commentée ne fonctionne pas (fournit un dernier élément null, au lieu de se terminer par le dernier nombre).

Est-ce que je fais quelque chose de mal ou est-ce un problème avec la bibliothèque?

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

J'ai aussi essayé de bidouiller avec l'arrangement ?: (par exemple, en préfixant le retour et en comparant à +1 à la place), sans succès. J'ai fouillé un peu en cherchant de la documentation à ce sujet, mais je n'ai rien trouvé. Évidemment, la syntaxe ?: n’est qu’une commodité, pas une nécessité, mais quand même ...

Était-ce utile?

La solution

Vous obtenez une NullPointerException en raison de l'utilisation de l'opérateur ternaire, expression conditionnelle, avec des types numériques différents. Java a des règles complexes lors du mélange de valeurs numériques de différents types dans une expression ternaire: Section JLS 15.25 .

Etant donné que endOfData () est pré-reçu pour renvoyer Entier , alors que localcount est un int , unboxes Java la valeur de endOfData () . Toutefois, étant donné que endOfData () renvoie une valeur null, l'opération d'annulation de la boîte a pour résultat une exception de pointeur null.

Vous pouvez continuer à utiliser l'instruction if ou déclarer localcount sous la forme Integer .

Autres conseils

Je suppose que le problème vient de votre utilisation de l'opérateur postincrément, conjointement avec l'opérateur ternaire. En plus de cela, les deux extraits devraient être tout à fait équivalents - et ce n’est pas la faute de AbstractIterator de ne pas les avoir car aucun de ses codes n’est appelé à ce moment-là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top