영화_시리즈 영화 상속 실습4

호떡·2022년 7월 28일
0

📝관련 실습: 상속과 다형성 (MovieTest.java)

  • ArrayIndexOutOfBoundsException 해결!

import java.util.Scanner;

public class MovieTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		MovieManager mm = MovieManager.getInstance();
		int sel;
		
		do{
			System.out.print("1. 영화등록\n2. 전체조회\n3. 제목으로 검색\n4. 일반영화 조회\n5. 시리즈영화 조회\n6. 평균상영 시간\n0. 종료\n>>> ");
			sel = sc.nextInt();
			sc.nextLine();
            
			if(sel == 1) {
				System.out.println("1. 일반 영화\n2. 시리즈 영화");
				sel = sc.nextInt();
					if(sel == 1) {
						System.out.println("관리번호를 입력하세요.");
						int id = sc.nextInt();
						sc.nextLine();
						System.out.println("영화 제목을 입력하세요.");
						String title = sc.nextLine();
						System.out.println("영화 감독을 입력하세요.");
						String director = sc.nextLine();
						System.out.println("영화 장르를 입력하세요.");
						String genre = sc.nextLine();
						System.out.println("영화 상영시간을 입력하세요.");
						int runningTime = sc.nextInt();
						
						Movie movie = new Movie(id,title,director,genre,runningTime);
						mm.add(movie);
					} else if(sel == 2) {
						System.out.println("관리번호를 입력하세요.");
						int id = sc.nextInt();
						sc.nextLine();
						System.out.println("영화 제목을 입력하세요.");
						String title = sc.nextLine();
						System.out.println("영화 감독을 입력하세요.");
						String director = sc.nextLine();
						System.out.println("영화 장르를 입력하세요.");
						String genre = sc.nextLine();
						System.out.println("영화 상영시간을 입력하세요.");
						int runningTime = sc.nextInt();
						System.out.println("시리즈 넘버를 입력하세요");
						int seriesNum = sc.nextInt();
						sc.nextLine();
						System.out.println("에피소드를 입력하세요");
						String episode = sc.nextLine();
						
						SeriesMovie movie = new SeriesMovie(id, title, director, genre, runningTime, seriesNum,episode);
						mm.add(movie);
					}
			}
			else if(sel == 2) {
				Movie[] movies =mm.getList();
				for(Movie m : movies) {
					System.out.println(m);
				}
			}
			else if(sel == 3) {
				System.out.println("영화 제목을 입력해주세요");
				String title = sc.nextLine();
				Movie[] movies = mm.searchByTitle(title);
				for(Movie m : movies) {
					System.out.println(m);
				}
			}
			else if(sel == 4) {
				Movie[] movies = mm.getMovies();
				for(Movie m: movies) {
					System.out.println(m);
				}
			}
			else if(sel == 5) {
				Movie[] movies = mm.getSeriesMovies();
				for(Movie m: movies) {
					System.out.println(m);
				}
			}	
			else if(sel == 6) {
				System.out.println(mm.getRunningTimeAvg());
			}
		
		} while(sel != 0);
	
	} //main
}//end class

제목으로 조회 시 예외

ArrayIndexOutOfBoundsException 가 발생하였다. 'title'로 조회할 땐 정상적으로 작동하지만 '2'로 조회할 땐 오류가 떴다.


                   else if(sel == 3) {
                       System.out.println("영화 제목을 입력해주세요");
                       String title = sc.nextLine();
                       for(int i=0; i<mm.getSize(); i++) {
                           Movie[] movies = mm.searchByTitle(title);
                           System.out.println(movies[i]);
                       }
                   }

for문 안의 코드들이 원인이었다. 영화 리스트 안의 목록들을 다 훑어서 입력된 제목(키워드)이 포함된 영화를 찾아낸다는 생각에 저렇게 작성한 것 같다. 하지만 이 로직은 이미 MovieManager 클래스에서 적용되어 코드가 작성되었다.
여기서 오류가 난 이유를 풀어 설명하자면, 숫자 '2'로만 검색할 때는 mm.searchByTitle(title) 의 반환값인 배열의 크기가 1 즉, 리턴값 Movie[ ]는 1개의 영화만을 원소로 가진다. 따라서 인덱스가 0이면 끝나는데 for(int i=0; i<mm.getSize(); i++) 으로 인해 인덱스가 0, 1까지 도는 것이다. 즉, for문 안에 mm.getSize() 로 인해서 원래의 배열 크기(초기 등록 상태의 Movie[ ]의 크기)인 2미만으로 for문이 돌게 되고, 인덱스가 0까지만 있는 배열에서 인덱스 1인 원소를 찾았기 때문에 ArrayIndexOutOfBoundsException 가 발생한 것이다. 따라서 'title'로 검색할 때는 초기 등록 상태인 Movie[ ]의 크기와 똑같은 리턴값을 출력하기 때문에 정상 작동되었던 것이다. 아래와 같이 코드를 수정하면 정상 작동한다.


                   else if(sel == 3) {
                       System.out.println("영화 제목을 입력해주세요");
                       String title = sc.nextLine();
                       Movie[] movies = mm.searchByTitle(title);
					   for(Movie m : movies) {
					   System.out.println(m);
					   }
                   }
  

0개의 댓글