Pergunta

Eu estou usando a biblioteca do Google Collections AbstractIterator para implementar um gerador. Deparei com um problema ao fazê-lo; Eu reduzi-lo para um tipo mais básico e reproduzido o problema. Esta redução é, obviamente, um exagero para o que ele faz, contagem de 1 a numElements através de um Iterable.

Essencialmente no código a seguir, as obras de versão-comentados, e aquele comentou não (fornece um elemento nulo passado, em vez de terminar no último número).

Estou fazendo algo errado, ou este é um problema com a biblioteca?

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

Eu também tentei brincar com o arranjo ?: (por exemplo, prefixo o retorno e comparando com uma vez), sem sucesso. Eu coloquei em torno de um pouco à procura de documentação sobre isso, mas não encontrou nada. Obviamente, a sintaxe ?: é apenas uma conveniência, não uma necessidade, mas ainda assim ...

Foi útil?

Solução

Você ganha um NullPointerException por causa do uso do operador ternário, expressão condicional, com diferentes tipos numéricos. Java tem regras complexas quando a mistura de valores numéricos de diferentes tipos em ternário expressão: JLS Section 15.25 .

Dado que endOfData() é captada para retornar Integer, enquanto localcount é um int, Java unboxes o valor de endOfData(). No entanto, dado que endOfData() retorna um valor nulo, os resultados da operação unboxing em uma exceção de ponteiro nulo.

Você quer pode continuar usando a instrução if, ou localcount declarar como Integer.

Outras dicas

Espero que o problema é com o uso do operador de pós-incremento, em conjunto com o operador ternário bem. Porque apartes de que, os dois trechos devem ser inteiramente equivalente -. E é dificilmente culpa do AbstractIterator se eles são não como nada do seu código está sendo chamado nesse ponto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top