문제

Google Collections 라이브러리를 사용하고 있습니다 Abstractiterator 발전기를 구현합니다. 나는 그렇게하는 동안 문제를 가로 질러 달렸다. 나는 그것을보다 기본적인 유형으로 줄이고 문제를 재현했습니다. 이 감소는 반복 가능한 반복을 통해 1에서 숫자로 계산하는 일에 대해 분명히 과도합니다.

기본적으로 다음 코드에서는 무인 버전이 작동하며 주석은 하나가 작동하지 않습니다 (마지막 숫자에서 끝나는 대신 널 요소를 마지막으로 제공합니다).

내가 뭔가 잘못하고 있습니까, 아니면 도서관에 문제가 있습니까?

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 3 원 운영자의 사용으로 인해, 다른 수치 유형의 조건부 표현. Java는 3 원 표현에서 다른 유형의 수치 값을 혼합 할 때 복잡한 규칙을 가지고 있습니다. JLS Section 15.25.

을 고려하면 endOfData() 돌아 오는 것이 선례입니다 Integer, 동안 localcount 이다 int, Java Unboxes의 값 endOfData(). 그러나 그 점을 감안할 때 endOfData() 널을 반환하고, Unboxing 조작은 NULL 포인터 예외로 만듭니다.

IF 문을 계속 사용하거나 LocalCount를 다음과 같이 선언 할 수 있습니다. Integer.

다른 팁

문제는 3 원 운영자와 함께 분쟁 후 연산자를 사용하는 것입니다. 그 바로 그만큼 두 개의 스 니펫은 완전히 동일해야합니다. 그리고 그 시점에서 코드 중 어느 것도 호출되지 않았으므로 초록 리터 레이터의 잘못이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top