2012-04-08 4 views
0

나는 다양한 스캐너 방법이 작동하는 방법에 대해 뭔가를 분명 실종해야하지만 정말 어떤 의미하지 않습니다이 코드가 유효한 동안next()가 포함 된 println을 제거하면 무한 루프가 발생합니까?

Scanner valueScan = new Scanner(line); 
valueScan.useDelimiter(","); 
while(valueScan.hasNext()) 
{ 
count++; 
} 

:

이 코드는 무한 루프의 원인을

이 오라클의 문서에서입니다
Scanner valueScan = new Scanner(line); 
valueScan.useDelimiter(","); 
while(valueScan.hasNext()) 
{ 
System.out.println("value token: " + valueScan.next()); 
cellCount++; 
} 

가 적용하거나 의미 있는지 확실하지 않다 : "입력 스캔을 위해 hasNext()의 이전 호출이 진정한 반환하는 경우에도, 기다리는 동안이 방법을 차단할 수 있습니다."(HTTP ://해야 할 것 cs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#next%28%29)

답변

4

hasNext 때문에 귀하의 첫 번째 경우에, 그래서 Scanner에서 아무것도 제거하지 않습니다 , 당신은 절대 상태를 바꿀 수 없으므로 무한 루프가됩니다. next은 입력을 추출하므로 Scanner의 상태가 변경됩니다.

+0

이것은 완벽하게 이해할 수 있지만, 왜 이것이 메소드 세부 사항에서 명시 적으로 언급되지 않은지 이해할 수 없습니까? 어쩌면 그것은 단지 나이지만 "이 스캐너에서 다음으로 완전한 토큰을 찾아서 반환합니다"라고 읽으면 접근 자와 같은 방법으로 들리지만 업데이트를 수행하지는 않습니다. – user1086516

+0

@ user1086516 : 아 좋아요. 'hasNext' /'next'는 반복자의 표준 자바 관용어입니다. –

0

두 번째 예제에서 valueScan.next()을 호출하면 스캐너가 앞으로 움직입니다. hasNext()은 스캐너에 다음 항목이 있는지 만 확인하지만 다른 작업은 수행하지 않으므로 적어도 하나 이상의 항목이 있으면 infinte 루프가 실행됩니다.

0

next()이없는 경우 Scanner은 반복되지 않습니다.

0

hasnext은 다음 요소가 있는지 만 알려주고 next은 해당 요소로 이동합니다.

첫 번째 루프에서는 첫 번째 요소에 머무르며 두 번째 요소가 존재한다는 것을 계속 알려주고 더 이상 아무것도하지 않습니다.

관련 문제