TIL - 키오스크 lv. 3 예외처리

Jiyeong Kim·2025년 1월 17일

TIL

목록 보기
11/24

구현 대상

  • 요구사항에 부합하는지 검토 파트 중
    • 유효하지 않은 입력에 대해 오류 메시지를 출력합니다.
    • 0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.

대상 코드

Kiosk.java

.
.
.
if (input == 0 ) {
                System.out.println("키오스크를 종료합니다.");
                break;
            } else if (input <= menuItems.size()) {
                System.out.println("선택한 메뉴 : "+ menuItems.get(input - 1));
                break;
            }  else {
                System.out.println("다시 입력해주세요.");
                continue;// 숫자 이외의 입력을 받았을 때 나오는 문구
            }
            .
            .

이용해야 하는 것: try-catch 예외처리/NumberFormatExcepation

catch(NumberFormatException nfe) {
}
  • 구상해야하는 코드의 흐름:
    1) try 문 : 사용자 입력 --> 입력값을 정수로 전환(parseDouble)
    2) catch 문 :

     try {
                // 1. 위험한 메소드의 실행을 "시도" 해 봅니다.
                // "시도" 해보는 코드가 들어가는 블럭입니다.
                ourClass.thisMethodIsDangerous();
            } catch (OurBadException e) {
                // 2. 예외가 발생하면, "잡아서" handling 합니다.
                // 예외가 발생하는경우 "handling" 하는 코드가 들어가는 블럭입니다.
    						// 즉 try 블럭 내의 구문을 실행하다가 예외가 발생하면
    						// 예외가 발생한 줄에서 바로 코드 실행을 멈추고
    						// 여기 있는 catch 블럭 내의 코드가 실행됩니다.
                System.out.println(e.getMessage());
            } finally {
                // 3. 예외의 발생 여부와 상관없이, 실행시켜야 하는 코드가 들어갑니다.
                // 무조건 실행되는 코드가 들어가는 블럭입니다.
                System.out.println("우리는 방금 예외를 handling 했습니다!");
            }

문제사항

 System.out.println("번호를 입력하세요: ");
            int input = scanner.nextInt();// 숫자를 입력 받기

            if (input == 0 ) {
                System.out.println("키오스크를 종료합니다.");
                break;
            }

            try{
                int number = Integer.parseInt(input);
                if (number > 0 && number <= menuItems.size()) {
                    System.out.println("선택한 메뉴 : "+ menuItems.get(input - 1));
                    break;
                } else {
                    System.out.println("다시 입력해주세요.");
                    continue;// 숫자 이외의 입력을 받았을 때 나오는 문구
                }
            } catch (NumberFormatException nfe) {
                System.out.println("숫자를 입력해주세요.");
                continue;
            } finally {
                // 3. 예외의 발생 여부와 상관없이, 실행시켜야 하는 코드가 들어갑니다.
                // 무조건 실행되는 코드가 들어가는 블럭입니다.
                System.out.println("입력하신 숫자는 : " + input + "입니다. ");
            }
        }

1) 처음 try 문 안에 int 타입의 변수를 그대로 input으로 지정했을 때 이미 위에 input값이 지정되어 있는 것에 대한 문제 발생
-> 임의로 number로 지정

2) int number = Integer.parseInt(input); 에서 input 값이 String으로 지정되어 있어야 하는데 int값으로 제공되는 문제 발생
-> 아예 입력값을 String으로 해도 되나? 싶지만 임의로 String으로 선언

  • String input = in.nextLine(); 형태로 input 선언 변형
  • 위 처럼 할 경우 Input값이 더 이상 정수가 아닌 문자열로 취급되므로 기존의 ==를 활용한 코드도 변형해주어야함(equal)
    • if ("0".equals(input) ) {
                      System.out.println("키오스크를 종료합니다.");
                      break;
                  }
          ```
          ```java
      System.out.println("선택한 메뉴 : "+ menuItems.get(number - 1));
                          break;
           ```

3) 추가적인 문제

String input = in.nextLine();

으로 선언할 경우 in.nextLine();에 붉은 줄이 떴다.

  • 원인: 변수 in이 선언되지 않음, 무작정 "String i = in.nextLine(); " 형태 사용
  • 해결 방안: 윗 쪽에 선언해둔 객체 명과 일치시켜줌
  • 과정 :
    (1) Scanner 객체명 파악
    Scanner scanner = new Scanner(System.in);
         ```
    (2) scanner로 변경
    String input = scanner.nextLine();
        ```

드디어 정상적으로 구현됨

profile
해봅시다

0개의 댓글