카테고리 없음

예외처리

fw3d 2025. 4. 30. 15:14
try{
    screenMain();
    System.out.println("매뉴를 선택해주세요");
    int choiceNumber1 = scan.nextInt();
    scan.nextLine();
    if ( choiceNumber1 >= 0 && choiceNumber1 <= 3 ){
        menus.get(choiceNumber1-1).printMenuList();
        int choiceNumber2 = scan.nextInt();
        if( choiceNumber2 >= 0 && choiceNumber2 <= 4 ){
            MenuItems selectedItem3 = menus.get(choiceNumber1-1).getMenuItemList().get(choiceNumber2 -1);
            System.out.println(selectedItem3.getName()+"을 선택하셨습니다.");
        } else if ( choiceNumber2 == 0 ){
            throw new IndexOutOfBoundsException();
        }
    } else if ( choiceNumber1 == 0 ){
        throw new IndexOutOfBoundsException();
    }
} catch (NumberFormatException e) {
    System.out.println("1~4사이의 숫자를 입력해주세요");
} catch (IndexOutOfBoundsException e){
    System.out.println("키오스크를 종료합니다");
    break;
} catch (IndexOutOfBoundsException e){
    System.out.println("뒤로가기");
}

 

0을 눌렀을때의 다른예외처리하는방법 (뒤로가기와 종료)

해결방법

Exception 클래스를 상속받는 Custom Exception을 만든다

package Kiosk.Level_5Remaster;

public class BackToMainMenuException extends Exception{
    public BackToMainMenuException(String message){
        super(message);
    }
}
public class ExitKioskException extends Exception{
    public ExitKioskException(String message){
        super(message);
    }
}

0일때 indexException 방지 

메뉴에서 0 일때 catch 종료

아이템리스트에서 0 일때 뒤로가기

세가지 예외처리

} catch (NumberFormatException e) {
    System.out.println("1~4사이의 숫자를 입력해주세요");
} catch (IndexOutOfBoundsException e){
    System.out.println("잘못된 입력입니다");
} catch (BackToMainMenuException e){
    System.out.println("뒤로가기");
    continue;
} catch (ExitKioskException e){
    System.out.println("키오스크를 종료합니다");
    break;
} catch (InputMismatchException e){
    System.out.println("잘못된입력입니다.");
    scan.nextLine();
}

계속해서 IndexOutOfBoundsException이 실행된다. 

catch문의 순서는 영향을준다 먼저작성한코드가 catch문을 실행하면 하위코드들은 catch하지 않는다.

Exception e가 실행되면 아랫줄의 ArithmeticException은 실행되지 않는다.

가장 구체적인 예외를 위에 작성해야 한다.

 

순서를 바꿔줘도 여전히 IndexException 이 실행된다.

if( choiceNumber2 >= 0 && choiceNumber2 <= 4 ){

예외를 명확히 하도록 입력받는 if문을 0에서 1로 변경하면 해결된다.

 

0으로 뒤로가기와 종료가 처리되니 이번엔

InputMisMatchException이 작동을 안한다. 

 

} else if ( choiceNumber1 == 0 ){
    throw new ExitKioskException("종료");
} else {
    throw new InputMismatchException("1~4가 아닌입력");

명시적으로 예외를 던져주니 해결

 

주요예외처리

 catch (BackToMainMenuException e){
    System.out.println("뒤로가기");
    continue;
} catch (ExitKioskException e){
    System.out.println("키오스크를 종료합니다");
    break;
} catch(InputMismatchException e){
    System.out.println("1~4의 숫자를 입력해주세요.");
    scan.nextLine();
} catch (NumberFormatException e) {
    System.out.println("잘못된 숫자입니다 1~4사이의 숫자를 입력해주세요");
} catch (IndexOutOfBoundsException e){
    System.out.println("범위오류입니다");
    scan.nextLine();
}

 

예외처리는 기계가 이해할 수 있도록 명확한 예외구간과 throw new 로 예외객체생성. 그리고 가장작은범위의 예외부터 차례로 catch문 작성하자.

초기설계 부족 처음 진입을 if로 구분해주면 많은 catch문을 쓰지않아도된다.