이전에는 루프 안에서 new Scanner 를 사용하여 몰랐던 에러지만
메모리의 효율적인 사용을 위해서 객체생성은 루프 밖에서 이루어 지도록 작성했다가 발견한 에러입니다.
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
while (true) {
Scanner sc = new Scanner(System.in);
try {
int num = sc.nextInt();
System.out.println(sc); // -- (1) int 타입
if (num == 1) {
System.out.println(sc); //
break;
}
} catch (InputMismatchException err) {
System.out.println(sc); // -- (2) 의도적인 인풋 에러
sc.next();
System.out.println(sc); // -- (3) next() 메소드 사용 스캐너 입력초기화
}
}
sc.close();
}
}
(1) 의 경우 match valid 가 true, nextInt() 메소드에 맞는 값이 들어왔음
(2) 의 경우 요구 타입은 int인 메소드에 String 입력, match valid=false 이다.
(3) .next() 메소드로 스캐너객체를 초기화하여 sc 객체 자체에서 에러가 나지 않도록 하였다. match valid=true
3의 과정이 없다면 try 블럭의 첫줄부터 에러가 날것이고 catch문으로 잡혀버린다.
그리고 스캐너 썼으면 잘 닫자 !
루프 밖에서 스캐너 호출해보겠다고 삽질 몇시간하다가 해결해서 기분이가 좋아 오랜만에 포스팅하는 벨로그
앞으로 꾸준하게 잘 쓰자 !