[java] 유효성 검사에서 InputMismatchException 처리가 안될 때

심심이·2024년 3월 17일
0

java

목록 보기
46/46
		int salary = 0;
		while(true) {
			System.out.print("11. 급여를 입력하세요(협의시 엔터):");
			salary = sc.nextInt();
			try {
				RecruitDto.setSalary(salary);
				break;
			} catch(InputMismatchException e) {
				System.out.println("문자는 입력이 불가합니다. 숫자나 엔터를 누르세요.");
			}
		}

해당 코드에서 try catch로 예외처리 했는데도 해당 오류가 뜨는 문제가 있음

Exception in thread "main" java.util.InputMismatchException
	at java.base/java.util.Scanner.throwFor(Scanner.java:939)
	at java.base/java.util.Scanner.next(Scanner.java:1594)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
	at controller.hssController.HssComanyCtrl.writeRecruit(HssComanyCtrl.java:337)
	at controller.hssController.HssComanyCtrl.companyMenu(HssComanyCtrl.java:56)
	at controller.hssController.HssComanyCtrl.login(HssComanyCtrl.java:201)
	at main.Main.main(Main.java:49)

오류가 뜨는 이유

InputMismatchException = 정수가 아닌 문자열을 입력하거나 정수 범위를 벗어난 값을 입력하면 이 예외가 발생함.

nextInt() 메서드를 호출하기 전에 이미 사용자 입력이 문자열로 변환됨->
예외가 발생하기 전에 이미 Scanner 클래스의 내부에서 예외 처리

해결하기

1) hasNextint

InputMismatchException을 처리하는 대신 nextInt() 호출 이전에 입력값이 정수인지 확인하고 처리 => Scanner 클래스의 hasNextInt() 메서드를 사용하여 입력이 정수인지 확인하고 처리

  1. hasNextInt() : 입력값이 정수일 경우 true, 아닐 경우 false
int salary = 0;
while(true) {
    System.out.print("11. 급여를 입력하세요(협의시 엔터):");
    if (sc.hasNextInt()) {
        salary = sc.nextInt();
        RecruitDto.setSalary(salary);
        break;
    } else {
        sc.next(); // 잘못된 입력값을 버림
        System.out.println("올바른 숫자 형식이 아닙니다. 다시 입력하세요.");
    }
}

2)parseInt()

int salary = 0;
while(true) {
    System.out.print("11. 급여를 입력하세요(협의시 엔터):");
    String input = sc.nextLine();
    if (!input.isEmpty()) {
        try {
            salary = Integer.parseInt(input);
            RecruitDto.setSalary(salary);
            break;
        } catch(NumberFormatException e) {
            System.out.println("올바른 숫자 형식이 아닙니다. 다시 입력하세요.");
        }
    } else {
        // 협의시 엔터인 경우에 대한 처리
        RecruitDto.setSalary(0); // 협의시 엔터인 경우에는 0으로 설정하거나 다른 처리
        break;
    }
}
profile
개발하는 심심이

0개의 댓글