사용자에게 정수를 입력받을 일이 있었다... 그래서 Scanner 를 사용했고(왜냐하면 BufferedReader는 너무 길어서 타자 치기 귀찮았음 죄송해요 하지만 덕분에 이런 공부를 했잖아요?)
정수를 입력받아야 하니 Scanner의 nextInt(); 메소드를 사용하고 try ~ catch 로 Exception 을 잡아내려고 했!는!데!
Scanner sc = new Scanner(System.in);
temp = true;
do
{
try
{
int a = sc.nextInt();
temp = false;
}
catch (Exception e)
{
System.out.println(e);
}
}
while(temp);
이런 구조를 사용하면
sc.nextInt() 에서 정수형으로 바꾸지 못하는 오류가 발생한다 -> catch 되어 Exception을 출력하고 sc.nextInt()로 돌아가서 사용자에게 다시 입력값을 받는다 -> 제대로 입력할 때 까지 오천번이고 다시 입력할 줄 알았답니다...
그러나
자신있게 실행한 결과 사용자에게 주어지는 입력기회는 단 한 번 뿐이고
System.out.println(e); 구문만 오천번이고 반복했다
ㅠㅠ
이때 진심 울고싶었음
나의 짝꿍 mz양과 절때 검색하지 말자는 피의 다짐을 해서 오만 api 도큐먼트를 눈알이 빠지게 읽어봤는데도 도저히 원인을!! (나만의 능력으로) 찾을 수 없었답니다.
그래서 어떠한 방법(검색)을 사용해서 공부한 결과!
Scanner 의 nextInt() 메소드는
사용자 입력값에서 우리 눈에는 보이지 않는 엔터값을(아닐지도 또 나의 오만함이 빚은 대충 읽기였을지도...) 가져가지 않기 때문에!! 스캐너의 버터엔 저 가져가지 않은 엔터값이 남아있어 계속계속계속계속 Exception이 catch 된다.
나의 예상
nextInt() 인데 a 입력 -> 삐용삐용 오류발생 다시 입력하세요~ -> (입력창 깨끗하게 비워짐) 새로 입력
but 차디찬 현실은
nextInt() 인데 a 입력 -> a + (입력하면서 자신있게 두들긴 엔터값) -> nextInt는 a만 쏙 빼감 편식미쳤음 -> 삐용삐용 오류발생 다시 입력어라라 (입력하면서 자신있게 두들긴 엔터값)이 남아있잖아? -> 벗어날 수 없는 무한반복의 굴레
그래서 그럼 그냥
next로 문자든 정수든 입력받고 이걸 int 형으로 변환하거나
Scanner sc = new Scanner(System.in);
boolean temp = true;
do
{
try
{
int a = Integer.parseInt(sc.next());//였나.. sc.next가 맞는지 기억이 안 나네
temp = false;
}
catch (Exception e)
{
System.out.println("제대로 입력해!!!!!");
}
}
while (temp);
BufferedReader 는 괜찮을까? 싶어서 해봤는데
저 둘은 잘 되더라구용
※ 결론
해결법 = 버퍼에 남아있는 값을 nextLine() 을 사용하여 비워준다
저는 catch 문 안에 넣어주었답니다
Scanner sc = new Scanner(System.in);
temp = true;
do
{
try
{
int a = sc.nextInt();
temp = false;
}
catch (Exception e)
{
System.out.println(e);
sc.nextLine();
}
}
while(temp);
'Study📚 > Java' 카테고리의 다른 글
자바 - 다차원 배열 연습 (0) | 2023.10.19 |
---|---|
자바 - 안내문 진거 (0) | 2023.10.19 |
자바 - 반복문 연습(별 찍기) (0) | 2023.09.26 |
자바 - 조건문과 반복문 (0) | 2023.09.25 |
자바 - 입출력 (0) | 2023.09.25 |