정답
public int get50thItem(int[] array) throws IllegalArgumentException{ if (array.length < 50) { throw new IllegalArgumentException(); } return array[49]; }
해설
원하는 조건으로 예외를 발생시키려면 throw 키워드를 사용해 예외 객체를 생성하면 됩니다.
자바 언어가 자체적으로 제공하는 예외는 일반적인 예외입니다. 숫자를 입력해야 하는데 숫자가 아닌 값을 입력하는 것처럼 일반적인 경우에만 예외를 발생시킵니다. 하지만 사용자는 그렇게 일반적인 경우가 아니더라도 예외를 발생시키고 싶습니다. 예를 들면, 1~100 사이의 숫자만 입력받게 하고 싶다든지, 지금처럼 배열의 길이가 50보다 작으면 예외를 발생시키는 것처럼요. 이런 경우는 자바 언어가 알아서 예외를 발생시킬 수는 없으므로 사용자가 원하는 경우에 강제로 예외를 발생시킬 수 있습니다.
문제를 잘 살펴보면 제시한 ExceptionExam 클래스의 get50thItem 메서드를 호출하면 인자로 들어온 배열의 길이를 확인하고, 배열의 길이가 50보다 작다면 무조건 0을 리턴하도록 작성했습니다. 그런데 문제는 이렇게 0을 리턴하면 진짜로 50번째 값이 0이었는지 배열의 길이가 50보다 작아서 0을 리턴했는지 모호해집니다. 그래서 배열의 길이가 50보다 작다면 명시적으로 예외 상황을 만들어주고 싶습니다. 자바가 자체적으로 발생시키는 예외 조건은 아니므로 사용자가 예외를 직접 발생시키면 되는데 이럴 때 사용하는 것이 Throw입니다.
정답 코드처럼 조건에 맞지 않았을 때 return 0;을 빼고 throw new IllegalArgument Exception();을 넣어주면 됩니다. 이때 문제에서 해당 Exception 처리는 언급하지 않으므로, 해당 Exception의 처리는 이 메서드를 사용하는 쪽으로 던져주면 됩니다. 앞 장에서 예외를 던지는 Throws를 배웠죠? 메서드 선언부 뒤쪽에 throws IllegalArgumentException이라고 추가하면 해당 예외를 던져줍니다. 이렇게 잘 처리하고 실행하면 배열의 크기가 조건에 맞을 때는 50번째 값을 꺼내서 리턴하고, 그렇지 않을 때는 IllegalArgumentException을 발생시킵니다.