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문을 쓰지않아도된다.