:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
12/04/12 11:44
Scanner를 사용하지는 않았으나, 잠시 확인해보니.
a입력시 nextInt()에서 InputMismatchException이 발생하구요. 이상태에서는 a가 Scanner내에 있는 상태이므로 그다음 루프에서 nextInt()시 다시 InputMismatchException이 발생합니다. 이를 고치르면 catch내에서 sc.next(); 를 추가하여Scanner 내부 queue(인지 모르겠지만..)의 'a'를 빼줘야 정상동작합니다. 더불어 첨언하자면. while을 돌리는 변수가 count인데 sc.nextInt() 값을 넘겨받는 변수도 count이면 안될듯합니다...(다른변수로 처리하심이..)
12/04/12 14:44
히든 님// 정말정말 감사합니다. 이렇게 하니까 오류가 수정이 바로 되네요
그런데 sc.next()로 빼준다는 의미가 정확히 어떻게 되는 거지요? 저는 항상 변수 = a.next() 나 변수 = a.nextInt()등으로 했었는데 스캐너 메소드를 넣어주는 거 없이 이렇게 쓸 수도 있는건가요?
12/04/13 07:39
입력과 커서의 위치를 잘 생각하면 이해하실수 있을거라 생각합니다.
사용자의 입력을 '3' 이라고 할때 현재 입력되고 있는 위치의 커서를 _라고 한다면 '_3'이되었다가 sc.nextInt()를 호출하게 되면 커서가 3을 만나서 3을 리턴하고 3 다음으로 넘어가게 되죠. 즉, '3_' 이렇게 3을 읽고 커서가 다음으로 넘어가게 되죠. 근데 만약에 'a'를 입력했다고 치면 '_a'로 시작해서 sc.nextInt()를 호출하면 커서가 a를 만나서 sc.nextInt()가 exception을 일으키고 catch로 넘어가지만 커서의 이동은 없습니다. 즉 여전히 '_a'로 되어있고, 다음 루프를 돌때 여전히 '_a' 이라서 다시 sc.nextInt() 만나고 무한루프를 도는거죠. 따라서 catch()안에서 sc.next()를 하면 '_a'의 위치였던 커서가 'a_' 이렇게 넘어가게 만들어서 다음 입력을 받을 수 있게 되는겁니다. 지금 소스코드에서 가장 간단한 해결 방법은 그렇게 sc.next()를 catch에 넣는거고, 그 외 가독성을 높이는 방법으로 sc.nextInt()와 sc.next()를 저렇게 두군데에다가 두지 않고 사용자 입력을 스트림을 다루는 부분은 한군데에다가 놓고 입력된값을 int로 바꿔서 처리를 할 수 있습니다. String userInput = sc.next(); int count = Integer.parseInt(userInput); 로 하고 catch안에는 NumberFormatException를 잡도록 하면 문자 입력에 대한 처리가 되겠죠. 또는 성능을 개선하는 방법으로 아예 exception이 일어나지 않도록 하는 접근법도 있겠네요. if(sc.hasNextInt()) count = sc.nextInt(); if(count <=1) 기타등등.. sc.next(); 개인적으로 exception은 최대한 줄이는게 좋다 생각해서 이 방법이 좋은것 같군요. 사용자 입력을 받는 방법 중에서 Scanner를 이용하는게 아마 제일 간단할거고요, 다른 방법으로 BufferedInputStream 인가 쓰는 방법도 있을텐데 구글 찾아보시면 금방 나올겁니다.
|