2012-01-13 2 views
1

나는 한 줄에 정수의 목록을 입력하는 사용자가 필요합니다, 그래서이 쓴 : 영원히 반복 계속하지만Scanner를 사용하여 한 줄에서 정수 목록을 읽을 때 무한 루프가 발생하는 이유는 무엇입니까?

public static Integer[] readIntegers() 
{ 
    Scanner input = new Scanner(System.in); 
    List<Integer> list = new ArrayList<Integer>(); 
    do list.add(input.nextInt()); 
    while(input.hasNextInt()); 
    return list.toArray(new Integer[list.size()]); 
} 

을! 스캐너에 숫자가없는 경우 hasNextInt()false을 반환 할 예정입니까? 이전 방법을 수정하려면 어떻게해야합니까? 또는 대신 nextLine()을 사용해야하고 String을 유출해야합니까? 프로그램이 다음 입력을 기다리고 있도록

+1

http://stackoverflow.com/questions/1794281/java-infinite-loop-using-scanner-in-hasnextint –

+0

당신은 EOF를 표준 입력으로 가져 왔습니까? [ctrl + z in windows, ctrl + d in linux] – amit

+0

전체 프로그램을 'Ctrl + Z'로 끝내지 않겠습니까? –

답변

3

System.in Enter 키를 눌러 "종료"하지 않습니다. 이런 식으로하려는 경우 while 표현에서 '\n'을 확인할 수 있습니다.

일반적으로, 나는 다른 방법으로 그것을 할 것을 선호 :

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
String line = br.readLine(); // line == null indicates end of input. 

또는 java.io.Console를 사용하여.

또한 do 대신 do/while을 사용하면 입력이 비어있는 경우 문제가 발생할 수 있습니다.

+0

좋은 답변입니다. 'InputStreamReader'에 대한 인코딩을 지정해야합니까? 나는 그것이'PrintStream'이기 때문에'System.in'이 이미 인코딩을 가지고 있다고 가정하지만, 아마도'InputStreamReader'는 그것에 대해 픽업하지 않을 것입니다. –

1

나는

EOF 먹이를 리눅스에서 윈도우에 ctrl+z 또는 ctrl+d를 사용하려면 .. 당신은 당신의 표준 입력에 EOF를 두지 않았다 생각합니다.

+0

@ Eng.Fouad : 당신은 명령 줄에서 방법에 입력을 먹이 있습니다. 명령 행은 긴 파일과 같으며 EOF가 발생할 때까지 계속 읽습니다. 당신의 표준에 [수동으로, 당신이 피드를 보내는 것과 같은 방식으로] EOF를 피드하십시오. – amit

+0

글쎄, 이클립스 (윈도우)'java.util.NoSuchElementException'에 Ctrl + Z를 입력했을 때이 예외가 발생했습니다 –

+1

스캐너가 "NoSuchElementException - 입력을 모두 사용한 경우"를 throw합니다. http://docs.oracle.com/javase/1.5를 참조하십시오. .0/docs/api/java/util/Scanner.html # nextInt % 28 % 29 – fasseg

1

방금 ​​한 줄을 읽고 내용을 Scanner에 넣으면 더 좋을 것입니다. 이렇게하면 사용자는 EOF를 넣지 않고 enter를 누르기 만하면됩니다.

또한 숫자가 입력되어 있지 않을 수도 있으므로 do...while 대신 while 루프가 필요합니다. do...while은 첫 번째 반복 이후 조건을 먼저 확인하기 때문에 코드가 없더라도 적어도 하나의 정수를 읽으려고합니다.

관련 문제