자바 Scanner 키입력 타입 유효성 체크

윤재·2022년 9월 21일
0

이전에는 루프 안에서 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문으로 잡혀버린다.
그리고 스캐너 썼으면 잘 닫자 !


루프 밖에서 스캐너 호출해보겠다고 삽질 몇시간하다가 해결해서 기분이가 좋아 오랜만에 포스팅하는 벨로그

앞으로 꾸준하게 잘 쓰자 !

profile
안 되면 될 때까지

0개의 댓글