예외 처리를 하는 방법을 알아보자
ㅇ일반 예외는 컴파일시에 자바가 예외처리코드 작성이 필요한 부분을 알려준다.
ㄴ빨간 밑줄로 알려준다. (Unhandled exception)
ㅇ하지만 실행 예외는 알려주지 않으므로 개발자가 경험을 바탕으로 직접 예외처리코드를 작성해야한다.
이 예외처리 코드에 대해 공부할 것이다.
예외처리코드(try-catch-fianlly 블록)
try-catch-finally 블록은 일반예외와 실행예외가 발생할 경우 예외처리를 할 수 있게 돕는다.
ㅇ 예외 없이 정상 실행 : catch 건너뛰고 finally 블록 실행.
ㅇ 예외 발생 : 거기서 즉시 코드실행 멈추고 catch 블록으로 이동해 예외처리코드를 실행한다. 그리고 나서 finally블록 실행.
ㅡfinally블록은 생략 가능. 예외발생 여부와 상관 없이 항상 실행할 내용이 있다면 finally를 작성하면 된다.
어쨌거나 항상 실행된다. try와 catch블록에 return문이 있더라도 상관 없다. finally 쓰면 항상 실행된다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
try-catch-finally 예외처리 코드 사용하는 예시를 보자
Class.forName() 메소드
ㅇ매개값으로 주어진 클래스가 존재하면 Class객체 리턴한다.
ㅇ존재하지 않으면 ClassNotFoundException이 발생
ㄴ일반 예외이므로.. 컴파일러가 개발자에게 다음과 같이 예외 처리 코드를 작성하도록 요구해준다.
반면! 위와 같이 작성하라는 안내가 나타나지 않는 '실행 예외'
예를 들면
ArrayIndexOutOfBoundsException, NumberFormatException등 실행 예외는
컴파일러가 예외처리 코드를 체크하지 않는다 (빨간 밑줄이 안생김)
>>개발자가 알아서 작성해야 한다! (아래 내용)
그럼 이제 실행 매개값을 주고 다시 실행해보자 (아래의 try catch finally문이 실행되도록!!)
catch에서 걸리도록 int가 아닌 문자열 매개값을 두 변수에 줘보자.
[Run -> Run Configurations]
이렇게 try - catch - finally 코드를 살펴봤다아
예외 종류에 따른 예외처리코드
ㅇ다중 catch
ㅇcatch의 순서
다중 catch
ㅡtry블록 내부에 여러 예외가 있을 수 있다. 다양한 예외처리 코드 작성이 필요할 수도 있다!!
ㅡ그래서 다중 catch블록 작성!
ㅡcatch블록의 "예외클래스타입"은 try블록에서 발생한 예외의 종류이다. (아 그치!! 예외는 클래스를 통해 관리되지!!)
ㅡ다수의 catch블록은 동시에 실행될 수가 없다. try블록에서 차례로 실행하면서 예외가 생기면 실행 멈추고 해당 catch블록으로 이동하기 때무니지
catch의 순서
다중catch 쓸 때 주의할 점이 있다.
ㄴ상위예외클래스가 하위예외클래스보다 아래 있어야 한다.
(하위 예외는 상위 예외를 상속 --> 하위 예외는 상위 예외타입도 된다. 그런데 상위타입은 하위 신경안쓴다. 하위가 상위를 상속하지 상위는 모 그냥.. 그러니까)
옳은 코드는 오른쪽(파랑) : 배열인덱스범위예외가 발생하면 첫번째 catch를 실행하고, 그 밖의 다른 예외 발생하면 두번째 catch가 실행된다.
발생가능한 예외의 상하위 관계를 잘 생각해서 catch의 순서를 배치해야 한다.
예외 떠넘기기
경우에 따라서 예외를 떠넘길 수 있다. (try-catch 작성 안하고)
throws 키워드 : 메소드 선언부 끝에 작성, 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할. throws 뒤에는 떠넘길 예외클래스를 쉼표로 구분해 나열한다.
(throws Exception이라고 쓰면 모든 예외를 떠넘기는 것이긴 하다)
ㄴthrows가 붙은 메소드는 반드시 try블록 안에서 호출되어야 한다.
ㄴ호출된 곳에서 예외를 처리하게 된다. (try-catch) (앗 결국 호출한곳에서 try-catch로 처리하는구나!!)
public void method1() { try { method2(); } catch(ClassNotFoundException e) { System.out.println("클래스가 존재하지 않습니다"); } } public void method2() throws ClassNotFoundException { Class class = Class.forName("java.lang.String2); } |
(접은글) 자바 api문서로 throws 확인하기
ㅇ자바 api도큐먼트 활용하기
자바 api도큐먼트에서 봤을 때, 클래스 생성자와 메소드 선언부에 throws 키워드가 붙어 있으면
반드시 try-catch 블록으로 예외처리를 해야 한다. (또는 throws를 다시 사용해 떠넘겨야 한다)
우와
해당 클래스에서 Throws할 수 있는 예외정보도 자바api에서 볼 수 있다.
<<예외 처리 떠넘기기>>
<<main() 메소드에서의 throws>>
메인 메소드에서 throws로 예외를 떠넘기면 결국 JVM이 최종적으로 예외처리를 한다.
ㄴ예외 내용을 콘솔에 출력하는 것으로 예외처리함
ㄴ하지만 좋지 못한 방법이라는데!! (프로그램 사용자 입장에서 생각해보자) -> main에서 try-catch블록으로 예외를 최정처리해주는 것이 바람직하다.
'JAVA' 카테고리의 다른 글
[JAVA] java.lang 패키지의 Object클래스 (0) | 2020.07.22 |
---|---|
[혼자 공부하는 자바] 7/21 11-1 [기본 API클래스] [java.lang 패키지] (0) | 2020.07.21 |
[혼자 공부하는 자바] 7/17 10-1 [예외 처리] [예외 클래스] [일반예외] [실행예외] (0) | 2020.07.17 |
[혼자 공부하는 자바] 7/15 9-2 [익명 객체] [익명자식객체] [익명구현객체] (0) | 2020.07.15 |
객체지향 프로그래밍 간단한 개념 정리 / 특징 (0) | 2020.07.14 |