1.각 단계로 돌아가기
- 목적 해당 문제 처리하고 나오기
- why? menuitem을 선택하는 숫자를 입력-> Menu X menuitemO을 보여주기
- 구성
while(stack<5) {
try {
kioskFunction.printMenu(menu);
System.out.print("메뉴를 선택해주세요: ");
int menuNum2 = getValidInt(scanner) - 1;
menuItem = kioskFunction.printSelection(menu, menuNum2);
break;
} catch (Exception e) {
System.out.println(e.getMessage());
stack++;
if(stack==4){
start();
}
}
- 트러블 슈팅
배경 : 메뉴 아이템 선택시 발생하는 문제 해결
발단 : 해당 부분에서 문제가 발생했지만 이는 전체메뉴로 귀결된다는 것은 바람직하지 않다고 생각됐습니다.
전개: try-catch문에 while문을 결합하여 해당 문제를 해결하려고 하였지만 탈출이 불가능한 while(true)문이 됐습니다,
절정: 임의의 수 stack을 사용해 while(true)문 5번정도 잘못입력하면 탈출하게 하였습니다,
결말: 완벽한 해결은 아니라고 생각됩니다.왜냐하면 예외처리에 대한 탈출시 return -1을 함으로 잘못된 입력값으로 전체 메뉴로 돌아간다는 점때문입니다. 이를 위해서는 if-else문을 추가해야 하는 것인가?에 대한 고민을 하게 됐습니다.
2. IllegalArgumentException 각각의 처리
- 목적 예외처리
- why? catch IllegalArgumentException e를 작동시켜서 해당문제를 표현하기 위해서이다.
- 구성
public Menu printCategory(int i) {
try {
Menu menu = menuDataBase.getMenuList().get(i);
System.out.println(menu.getCategory()); // 카테고리 출력
return menu;
} catch (IndexOutOfBoundsException e) {
throw new IllegalArgumentException("⚠ 메뉴 선택 범위를 초과했습니다.");
}
}
/**
* 특정 메뉴의 모든 메뉴 아이템을 출력하는 메서드
* @param menu 출력할 메뉴 객체
*/
public void printMenu(Menu menu) {
for(int i=0; i<menu.getMenuItems().size(); i++){
MenuItem menuItems=menu.getMenuItems().get(i);
System.out.print((i+1)+". ");
menuItems.printMenuItem();
}
}
/**
* 특정 메뉴에서 선택한 메뉴 아이템을 출력하고 반환하는 메서드
* @param menu 메뉴 객체
* @param i 선택한 메뉴 아이템의 인덱스
* @return 선택한 메뉴 아이템 객체
* @throws IllegalArgumentException 메뉴 아이템 선택 범위를 초과한 경우 예외 발생
*/
public MenuItem printSelection(Menu menu, int i) {
try {
MenuItem selectedItem = menu.getMenuItems().get(i);
int selectedpirce= (int)(selectedItem.getPrice()*1000);
System.out.println(selectedItem.getName() + " " + selectedpirce+ "원을 선택하셨습니다.");
return selectedItem;
} catch (IndexOutOfBoundsException e) {
throw new IllegalArgumentException("⚠ 메뉴 아이템 선택 범위를 초과했습니다.");
}
}
}
MenuItem menuItem=null;
int stack=0;
while(stack<5) {
try {
kioskFunction.printMenu(menu);
System.out.print("메뉴를 선택해주세요: ");
int menuNum2 = getValidInt(scanner) - 1;
menuItem = kioskFunction.printSelection(menu, menuNum2);
break;
} catch (Exception e) {
System.out.println(e.getMessage());
stack++;
if(stack==4){
start();
}
}
}
- 트러블 슈팅
배경 : 변수선언만 했을 때 문제발생
->java: variable menuItem might not have been initialized
발단 :해당 문제에 대한 검색을 실시하였습니다.
전개: 해당 선언이 초기화가 되지 않아서 생기는 문제라는 것을 확인했습니다,
절정: MenuItem menuitem=null이라고 초기값 설정으로 문제해결
결말: 초기화 선언을 다른 int값에도 적용을 하였는데 옳은 선택인지는 아직도 잘 모르겠으며 또한 맨 처음엔 이 문제가 발생하지 않았다는 점에서 습관화 하면 코드 수정을 할 때 좋지 않을까 생각하게 됐습니다.
3. 메뉴 전체취소
- 목적 메뉴의 전체취소
- why? 5번을 눌렀을 때, 메뉴를 전체 취소 시키기 위함이다
- 구성
public void totalreomeCart(){
cartlist.clear();
}
case 5:
if (!cart.getCartlist().isEmpty()) {
cart.totalreomeCart();// 장바구니 비우기
System.out.print("장바구니가 비워졌습니다.");
} else {
System.out.print("⚠ 선택하신 제품이 없습니다\n");
}
break;
- 트러블 슈팅
초반 생각
List<MenuItem> cartlist =cart.getCartlist();
int cartlistSize=cartlist.size()-1;
for (int i=cartlistSize;i<=0;i--){
cartlist.remove(i);
}
cart.setCartlist(cartlist);
배경 :위 코드를 실행->IndexOutOfBoundsException
발단 :리스트 삭제 시키는 방법이라고 검색.
전개: 아래에 코드처럼 구성을 하여서 문제를 해결하였습니다.
List<MenuItem> cartlist =cart.getCartlist();
cartlist.clear();
cart.setCartlist(cartlist);
절정: kiosk에 자체적으로 기능이 있다고 판단하여서 객체 지향적이지 않다고 생각하여서 구성의 단계처럼 구현하였습니다.
결말: 코드의 기능 같지만, 저는 아직 초심자이기 때문에 저런 하나하나의 생각이 중요하다고 판단하였습니다. 이는 나중에 팀프로젝트를 할 때 더욱 빛나기에 지금은 생각이지만 후엔 습관이 될 수 있도록 노력해야한다고 생각됩니다.
참고자료
java: variable a might not have been initialized
java: variable a might not have been initialized 해석해 보면 변수가 초기화되지 않았다는 오류이다. 왜 이런 오류가 발생할까? 컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이다. 그래서 어떠한
vwvww.tistory.com
[Java] 예외처리 반복 - 올바른 입력값을 받을 때까지 (try-catch)
프로그램을 작성하다 보면 예외를 처리한 후, 예외가 발생된 메서드를 다시 실행해야하는 경우가 있습니다. 그것을 수행하는 몇 가지 방법에 대해 정리해보고자 합니다. 예외 처리의 기본적인
woojin.tistory.com
https://velog.io/@imnameim/Java-Clear
[Java] List Clear()에 대해서
List의 모든 요소를 삭제한다.map에 String, List<String> 형식으로 값을 넣을 때 List객체 생성에 대한 공부\[]list1: c, dlist2: c, dlist를 clear()로 값을 다 지웠다고 생각하고 다른 객체로 바라본다면 경기도
velog.io