오늘은 <자바의 정석> 예제 부분을 다 공부 했으므로 거의 마지막이었던 HighLow 문제 예외처리해보기를 기록해보려고 한다.
< 자바의 정석 > 예제 8-7. 다음은 1~100사이의 숫자를 맞추는 게임을 실행하던 도중에 숫자가 아닌 영문자를 넣어서 발생한 예외이다. 예외처리를 해서 숫자가 아닌 값을 입력했을 때는 다시 입력을 받도록 보완하라.
1과 100사이의 값을 입력하세요 :50
더 작은 수를 입력하세요
1과 100사이의 값을 입력하세요 :asdf
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 StandardOfJava.ExceptionStudy.HighLow.main(HighLow.java:15)
public class HighLow {
public static void main( String[] args ) {
// 1~100사이의 임의의 값을 얻어서 answer에 저장한다.
int answer = (int) ( Math.random() * 100 ) + 1;
int input = 0; // 사용자입력을 저장할 공간
int count = 0; // 시도횟수를 세기 위한 변수
do {
count++;
System.out.print( "1과 100사이의 값을 입력하세요 : " );
input = new Scanner( System.in ).nextInt();
if ( answer > input ) {
System.out.println( "더 큰 수를 입력하세요." );
} else if ( answer < input ) {
System.out.println( "더 작은 수를 입력하세요." );
} else {
System.out.println( "맞췄습니다." );
System.out.println( "시도횟수는 " + count + "번입니다." );
break; // do-while문을 벗어난다.
}
} while ( true ); // 무한반복문
}
}
1. 처리해줘야 할 예외 : InputMismatchException
2. try-catch-finally를 다시 생각해 보자. 이걸 해보고 하다가 오류가 나면 catch에서 잡아.
3. 그럼 오류가 날 수 있는 부분을 try로 감싸준다. 여기서는 input 값에 들어오는 값이 int가 아닐 때 오류가 날 수 있으므로 그 부분을 감싸준다. -> 일단 실행!
try {
input = new Scanner( System.in ).nextInt();
} catch ( InputMismatchException ime ) {
System.out.println( "잘못된 값을 입력하셨습니다. 다시 입력해 주세요." );
}
1과 100사이의 값을 입력하세요 : 50
더 작은 수를 입력하세요.
1과 100사이의 값을 입력하세요 : asdf
잘못된 값을 입력하셨습니다. 다시 입력해 주세요.
더 작은 수를 입력하세요.
1과 100사이의 값을 입력하세요 :
잘못된 값을 입력하셨습니다. 다시 입력해 주세요. 다음에 1과 100 사이의 값을 입력하세요. 가 나와야 한다.
이 경우에는 그 전에 들어가 있던 input값이 내려가면서 answer < input 에 걸렸기 때문에 더 작은 수를 입력하세요. 부분이 출력되는 것이다. 즉, 다음 while문을 실행해야 한다.
catch문에서 continue;를 추가해준다.
try {
input = new Scanner( System.in ).nextInt();
} catch ( InputMismatchException ime ) {
System.out.println( "잘못된 값을 입력하셨습니다. 다시 입력해 주세요." );
continue;
}
잘 보완되었음을 알 수 있다! 호텔 예약 프로그램, 키오스크 프로그램, 메모 프로그램 등등 이번에 한 프로젝트 대부분이 Scanner로 값을 받아와서 콘솔에 출력하면서 프로그램을 구현했는데, 대부분 다 예외처리를 하지 않았다. 이번에 배운 예외처리를 프로젝트에 적용시켜 리팩토링 하면 더 완성도 있는 프로그램을 만들 수 있을 것 같다. 시간이 나면 한 번 리팩토링 해보는 걸로! 다른 캠퍼분들보다 진도가 너무 느린 거 같지만 나는 나만의 길을 가면 된다! 어제의 나보다 오늘의 나가 더 잘하니까 괜찮아!
'STUDY > JAVA' 카테고리의 다른 글
[TIL] 예외 되던지기(Exception re-throwing)는 언제 사용될까? (0) | 2023.06.21 |
---|---|
[TIL] ConcurrentModificationException (0) | 2023.06.20 |
[TIL] printStackTrace()는 왜 아래에 찍힐까? (0) | 2023.06.14 |
[TIL] Getter와 Setter. 왜 쓸까? (1) | 2023.06.12 |
[TIL] 프로그래머스 - 최댓값과 최솟값 ( 느려지게 하는 범인 찾기 ) (0) | 2023.06.11 |