인프런 커뮤니티 질문&답변

owl s님의 프로필 이미지
owl s

작성한 질문수

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

문제와 풀이3

문제와풀이3 강의중 inputmismatchexception 예외처리 하는 방법이 궁금합니다

작성

·

97

·

수정됨

0

[질문 내용]

섹션9 배열 문제와풀이3 강의 10:41초부터

선생님께서 사용자가 메뉴를 잘못칠 수 있는 경우에 처리방법을 else문으로 알려주셨는데요!

 

만약 사용자가 아래처럼 숫자가 아닌 문자를 입력하면 어떻게 처리를 해야하는지 궁금하였습니다.

image.png

 

입력값을 문자로 하였을때 나오는 inputmismatchexception 에러검색을 하다가 try catch문을 알게되었습니다

제가 원하는 방향은 사용자가 정수가 아닌 문자를 입력했을시에

에러메시지를 출력하고 다시 메뉴 선택으로 돌아가는 방향으로 하고싶어서

 

전체코드를 보시면 try문에 실행하고자 하는 코드를 넣고,

메뉴선택시 문자를 입력하면 에러가 나도록 catch문에 에러메시지를 출력하고 continue문을 넣었습니다.

package array.ex;

import java.util.InputMismatchException;
import java.util.Scanner;

public class ProductAdminEx {
    public static void main(String[] args) {

//        *제약 조건 : 상품은 최대 10개까지 등록할 수 있다.*


        int maxCount = 10;
        // 상품구조 최대치를 유연하게 정하기위해 ArrayList 자료구조 사용
        int productCount = 0;

        String[] productNames = new String[maxCount];
        int[] productPrices = new int[maxCount];


        Scanner sc = new Scanner (System.in);

        while(true) {

            System.out.println("1. 상품등록 | 2. 상품목록 | 3. 종료");
            System.out.print("메뉴를 선택하세요 : ");

            try {
                int option = sc.nextInt();
                sc.nextLine();
                if(option == 1) {
                    if(productCount >= 10)  {
                        System.out.println("더 이상 상품을 등록할 수 없습니다.");
                        continue;
                    }
                    System.out.print("상품 이름을 입력하세요:");
                    productNames[productCount] = sc.nextLine();
                    System.out.print("상품 가격을 입력하세요:");
                    productPrices[productCount] = sc.nextInt();
                    sc.nextLine();
                    productCount++;

                }

                else if(option == 2) {
                    System.out.println("지금까지 등록한 상품의 이름과 가격입니다.");
                    for(int i = 0; i < productCount; i++) {
                        System.out.println(productNames[i] + ":" + productPrices[i]);
                    }
                }

                else if(option == 3) {
                    System.out.println("프로그램을 종료합니다.");
                    break;
                }
//            잘못된 메뉴 입력시 문자입력시에 inputmismatchexception 예외처리를 사용할 수 있다.

                else {
                    System.out.println("잘못된 메뉴 입력입니다.");

                }
            } catch (InputMismatchException e) {
                System.out.println("[ERROR] 숫자를 입력해주세요.");
                break; // continue문을 쓰면 에러메시지가 계속 반복된다.
            }


        }


    }
}

 

문제는 다시 메뉴선택 부분으로 가지않고 끝없이 에러문이 반복됩니다. 그래서 일단 break문을 써서 프로그램이 종료되도록 하였습니다..

image.png

 

 

 

여기서 에러메시지가 한번 출력되고 다시 메뉴선택 부분으로 가도록 하려면 어떻게 해야 할까요..?!

 

 

 

 

답변 1

0

안녕하세요. owl s님, 공식 서포터즈 y2gcoder입니다.

예제 답안을 기준으로 정말 간단하게 고치자면 이렇게 고칠 수 있을 것 같습니다!

public class ProductAdminEx {

    public static void main(String[] args) {
        int maxProducts = 10;
        String[] productNames = new String[maxProducts];
        int[] productPrices = new int[maxProducts];
        int productCount = 0;

        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료\n메뉴를 선택하세요:");
//            int menu = scanner.nextInt();
//            scanner.nextLine();

            int menu = -1;
            try {
                menu = scanner.nextInt();
                scanner.nextLine(); // 입력 버퍼 제거
            } catch (InputMismatchException e) {
                System.out.println("잘못된 입력입니다. 숫자를 입력해 주세요.");
                scanner.nextLine(); // 잘못된 입력 버퍼 제거
                continue;
            }

            if (menu == 1) {
                if (productCount >= maxProducts) {
                    System.out.println("더 이상 상품을 등록할 수 없습니다.");
                    continue;
                }

                System.out.print("상품 이름을 입력하세요:");
                productNames[productCount] = scanner.nextLine();

                System.out.print("상품 가격을 입력하세요:");
                productPrices[productCount] = scanner.nextInt();

                productCount++;
            } else if (menu == 2) {
                if (productCount == 0) {
                    System.out.println("등록된 상품이 없습니다.");
                    continue;
                }
                for (int i = 0; i < productCount; i++) {
                    System.out.println(productNames[i] + ": " + productPrices[i] + "원");
                }
            } else if (menu == 3) {
                System.out.println("프로그램을 종료합니다.");
                break;
            } else {
                System.out.println("잘못된 메뉴를 선택하셨습니다.");
            }

        }
    }

}

 +추가)

아마도 owl s님께서 만드신 답안에서 계속 무한 반복이 되었던 이유는 catch 문에서 잘못 입력된 문자열 버퍼를 비워주지 않아 잘못 입력한 값을 버퍼에 가진 채로 처음으로 돌아갔기 때문이지 않을까 생각합니다.

image.png

작성해주신 코드에서 이렇게 처리해보시겠습니까?

 

감사합니다.

owl s님의 프로필 이미지
owl s
질문자

우와..... y2gcoder님 정말.. 정말 감사합니다..

은혜 입은 까치의 마음이 이런걸까요.. 써주신 코드보고

try catch문은 이렇게 쓰는거구나!

무한반복이 이래서 됐던거구나!! 하고 알게된것에 너무나 신기하고 감사해서 제가 y2gcoder님께 가서 직접 절이라도 다 하고싶은 마음이네요오ㅠㅠ

한편으론 제가 더 문법에대해 더 공부하고 숙지한 다음 질문드렸어야 하는거 아닌가해서 아차 싶었는데 너무 감사합니다 ㅠㅠ

owl s님의 프로필 이미지
owl s
질문자

아 추가로 혹시 int menu -1; 을 써주신 이유도 질문드려도 될까요..?!

정말 감사합니다.. ㅠㅠ

해당 부분은 큰 이유는 없습니다!

정말 개인적으로 나중에 메뉴가 추가되더라도 대응하는 숫자 중 음수를 사용하지는 않을 것 같아서 -1로 초기화 했습니다 🙂 그냥 0으로 두셔도 무방할 것 같습니다!

파이팅입니다!

owl s님의 프로필 이미지
owl s
질문자

우와 그런이유로 쓰셨군요..!! 답변 주시는거 볼때마다 눈이 번쩍 떠집니다!!! 정말 감사합니다!! 😆

owl s님의 프로필 이미지
owl s

작성한 질문수

질문하기