일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- mark directory as
- getMessage()
- 이클립스
- 멀티 catch 블럭
- 깃베쉬
- 색상에 따른 상태
- 인텔리제이
- throw e
- exception re-throwing
- 스프링 mvc프로젝트가 안뜰때
- source root
- unchecked예외
- chained exception
- 인텔리제이물음표파일
- 소스루트설정
- 예외처리
- printStackTrace()
- 사용자 정의 예외
- arrays메서드
- 예외발생
- 빨간파일
- 파일을 읽을 수 없을때
- 예외 발생
- checked예외
- POST요청
- 설치에러
- 자바클래스가 안보일때
- 빨간폴더
- mvc project 생성
- 포트충돌
- Today
- Total
프로그래밍 스티치
메서드에 예외 선언하기 본문
메서드에 예외 선언하기
예외를 처리하는 방법에는 try-catch문 뿐만 아니라 에외를 메서드에 선언하는 방법이 있다. 이를 예외 떠넘기기(호출한 사람(메서드)에게)라고도 하는데 자세히 알아보자
메서드에 예외를 선언하려면, 메서드의 선언부에 키워드 thorws를 사용해서 메서드 내에서 발생할 수 있는 예외를 적어주기만 하면 된다, 예외가 여러개일 경우에는 쉼표로 구분한다.
void method() throws Exception1, Exception2, ... , ExceptionN {
}
알아두어야할점
1.Exception에 해당하는 내용으로는 보통 필수처리 예외(checked)만 작성하는게 정석이며, 선택처리 예외(unchecked)도 작성할수는 있다.
2.메서드가 호출시 발생가능한 예외를 호출하는쪽에 알리는것!
3.예외를 발생시키는 키워드 throw와 메서드에 선언할 때 쓰이는 throws를 잘 구별하자.
예외를 선언하면, 이 예외 뿐만 아니라 그 자손타입의 예외까지도 발생할 수 있다는 점제 주의하자, 앞서 오버라이딩에서 살펴본 것과 같이, 오버라이딩할 때는 단순히 선언된 예외의 개수가 아니라 상속관계까지 고려해야 한다. 즉, 단순히 단순히 개수만 따져서 될 문제가 아니다!
이렇게 메서드 선언부에 예외를 선언함으로써 메서드를 이용하려는 사람이 메서드의 선언부를 보았을때, 이 메서드를 사용하기 위해서는 어떤 예외들이 처리되어져야 하는지 쉽게 알 수 있다.
public static void main(String[] args) throws Exception {
method1(); // 같은 클래스내의 static멤버이므로 객체생성없이 직접 호출가능.
} // main메서드의 끝
static void method1() throws Exception {
method2();
} // method1의 끝
static void method2() throws Exception {
throw new Exception();
} // method2의 끝
위의 예제를 실행하면
Exception in thread "main" java.lang.Exception
at Ex8_9.method2(Ex8_9.java:11)
at Ex8_9.method1(Ex8_9.java:7)
at Ex8_9.main(Ex8_9.java:3)
이러한 예외가 발생하는데 이 결과로부터 3가지 사실을 알 수 있어야한다.
1. 예외가 발생했을때, 모두 3개의 메서드(main, method1, method2)가 호출스택에 있었으며
2. 예외가 발생한곳은 제일 윗줄에 있는 method2라는 것
3. main메서드가 method1()을, 그리고 method1()은 method2()를 호출했다는 것을 알 수 있다.
호출스택역시 스택의 개념에서 가져온것이라 스택의 개념과 같이 본다면 더욱 쉽게 이해할 수 있는데
스택의 특징으로는 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO ( Last In First Out ) 구조로 되어있습니다.
이를 바탕으로 호출스택(call stack)의 맨위에는 현재 진행중인 메서드가 있고
그 바로 밑의 메서드는 현재 진행중인 메서드를 호출한 메서드이며, 밑에있는 메서드들은 종료된것이 아니라 진행중인 메서드가 끝날때까지 대기중인 메서드입니다.
다시 위의 예제로 돌아가서 얘기를 해보자면 method2()에서 'throw new Exception();'문장에 의해 예외가 강제적으로 발생했으나 try-catch문으로 예외처리를 해주지 않았으므로, method2()는 종료되면서 예외를 자신을 호출한 method1(0에게 넘겨줍니다. 그런데 method1()에서도 예외처리를 해주지 않았으므로 종료되면서 main메서드에게 예외를 넘겨줍니다. 그러나 main메서드에서 조차 예외처리를 해주지 않았으므로 main메서드가 종료되어 프로그램이 예외로 인해 비정상적으로 종료되는것입니다.
'JAVA > 예외처리' 카테고리의 다른 글
예외 되던지기(exception re-throwing) (0) | 2022.02.11 |
---|---|
finally블럭 (0) | 2022.02.09 |
예외 발생시키기 (0) | 2022.02.08 |
멀티 catch 블럭 (0) | 2022.02.08 |
try-catch문에서의 흐름 (0) | 2022.02.08 |