PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2012/04/12 11:29:14
Name 승뢰
Subject java관련 여쭈어 볼게 있습니다..
아래 경우엔 어떻게 해야 하나요..답변좀 부탁드릴께요~

               Scanner sc = new Scanner(System.in);
                int count = 0;
                while(count<=1){
                        System.out.print("몇명이 플레이 할지 결정하세요 >");
                        try{
                                count = sc.nextInt();
                                if(count<=1){ //두명 이상이 게임을 해야 하기때문에 if문을 설정해서 오류문을 띄웁니다.
                                        System.out.println("2이상의 정확한 수를 입력하세요.");
                        }
                                else
                                        break;
                        }
                        catch(InputMismatchException e){
                                System.out.println("정확한 숫자를 입력하세요.");
                        }
                }

질문의 요지는 다음과 같습니다.
숫자 대신 문자 (ex : a) 를 입력하면 catch문에서 오류를 띄우고 다시 입력창이 나와야 하는데
입력은 안뜨고 계속 "몇명이 플레이할지 결정하세요"이거랑 "정확한 숫자를 입력하세요."이것만 반복해서 뜨게되는데
왜 이런걸까요? catch문이 끝나면 while로 돌아가서 다시 try를 해야 하지 않나요?..ㅠ 답변 부탁드릴께요~

통합규정 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) 기타등등..
else

sc.next();


개인적으로 exception은 최대한 줄이는게 좋다 생각해서 이 방법이 좋은것 같군요. 사용자 입력을 받는 방법 중에서 Scanner를 이용하는게 아마 제일 간단할거고요, 다른 방법으로 BufferedInputStream 인가 쓰는 방법도 있을텐데 구글 찾아보시면 금방 나올겁니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
131840 한국인들이 잘 모르는 영어단어 발음 어떤것들이 있을까요? [37] Right2810 12/04/12 2810
131839 LOL관련 쪼말유저 질문입니다 [10] Daybreak1663 12/04/12 1663
131838 허벅지와 엉덩이 살을 빼고 싶습니다 [13] 리니시아2097 12/04/12 2097
131837 게임 리프트 해보신분? [5] 라울1546 12/04/12 1546
131836 이번 총선을 대선으로 바꾸면 [2] bins1591 12/04/12 1591
131834 담배피우는 여자 좋아하세요? 그리고 담배에 대한 주저리 [48] 창이8556 12/04/12 8556
131833 이번 총선의 결과를 가장 잘 예측한 사람(집단)은 누구일까요? [5] jjohny=Kuma1556 12/04/12 1556
131832 배틀쉽 어떤가요? [5] possible1850 12/04/12 1850
131831 nba 관련 질문입니다! [1] 물음표1732 12/04/12 1732
131830 통합진보당 혹은 민주노동당의 확실한 종북, 패권주의자에 대해서 [10] 임시닉네임1528 12/04/12 1528
131829 LOL에 대한 질문인데요. [3] 미하라1526 12/04/12 1526
131828 올해 대선 어떻게 보시나요? [17] 오프라인표시1603 12/04/12 1603
131827 학교 근처 선거운동에 대한 질문입니다. [2] 세느1555 12/04/12 1555
131826 java관련 여쭈어 볼게 있습니다.. [3] 승뢰2530 12/04/12 2530
131825 정치를 전혀 모르는 20대 유권자 입니다. [21] 싸구려신사2116 12/04/12 2116
131824 공대생 석사 평균 취업나이와 병특관련 질문 [3] 효주찡3420 12/04/12 3420
131822 [lol] 캐릭 관련 질문. [30] 율이1923 12/04/12 1923
131821 최근 10년 유명한 야구 선수 좀 알려주세요 [10] 참외아빠2091 12/04/12 2091
131820 원룸 전세, 월세 정보를 알아볼 수 있는 좋은 사이트 추천 부탁드려봅니다 [2] Absinthe 1551 12/04/12 1551
131819 이번 선거에서 '김용민 씨의 막말' 은 어느 정도의 영향을 미쳤을까요? [10] 1868 12/04/12 1868
131818 인터넷 개인거래로 주류거래가 가능한가요? [2] nickyo1917 12/04/12 1917
131817 그런데 젊은 층에서 박근혜씨는 왜 안 되는거죠? [20] 바카스2383 12/04/12 2383
131816 부정선거는 어떻게 된건가요? [2] Owen1696 12/04/12 1696
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로