일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 빨간파일
- POST요청
- chained exception
- 자바클래스가 안보일때
- 색상에 따른 상태
- arrays메서드
- 예외처리
- source root
- 빨간폴더
- printStackTrace()
- 파일을 읽을 수 없을때
- 사용자 정의 예외
- mvc project 생성
- 설치에러
- 인텔리제이
- throw e
- 스프링 mvc프로젝트가 안뜰때
- checked예외
- 인텔리제이물음표파일
- 소스루트설정
- unchecked예외
- getMessage()
- 예외 발생
- exception re-throwing
- 예외발생
- 멀티 catch 블럭
- 포트충돌
- 깃베쉬
- mark directory as
- 이클립스
- Today
- Total
프로그래밍 스티치
try-catch문에서의 흐름 본문
try-catch문에서의 흐름
System.out.println(1);
try {
System.out.println(0/0);
System.out.println(2); // 실행되지 않는다.
} catch (ArithmeticException ae) {
System.out.println(3);
} // try-catch의 끝
System.out.println(4);
위의 예제를 실행하면 1,3,4 순으로 출력이 되는데 1을 출력한다음 try문에서 (0/0)으로 나누는 ArithmeticException이 발생하였으므로, 예외가 발생! 아래 2부터는 출력되지않고 catch문으로 넘어간다. 발생한 예외에 해당하는 catch블럭으로 넘어가서 문장들이 수행되므로 3이 출력되고 try-catch문이 끝난뒤 4를 출력하여 1,3,4 가 출력되는 것이다.
내부적으로 어떻게 작동되는지 알아보면, 예외가 발생하면, 발생한 예외에 해당하는 클래스의 인스턴스가 만들어지고 첫번째 catch블럭부터 차례로 내려가면서 catch블럭의 괄호()내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof연산자를 이용해서 검사하게 되는데, 검사결과가 true인 catch블럭을 만날 때까지 검사는 계속된다.
예를 들어 위에 예시에서는 ArithmeticException이 발생했으므로 ArithmeticException인스턴스가 생성되어서
ArithmeticException instance of (catch문 안의 예외의 종류) 를 실행하여 true이면 블럭에 있는 문장들을 모두 수행한 후에 try-catch문을 빠져나가고 예외는 처리된다.
모든 예외 클래스는 Exception클래스의 자손이므로, catch블럭의 괄호에 Exception클래스 타입의 참조변수를 선언해 놓으면 어떤 종류의 예외가 발생하더라도 이 catch블럭에 의해서 처리된다!
그래서 finally 직전의 catch문에는 Exception클래스타입의 참조변수를 선언해놓는것이 관행적인것 같다.
printStackTrace()와 getMessage()
예외가 발생했을때 생성되는 예외 클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨져있으며, 위의 메서드를 활용해 이 정보들을 얻을 수 있다. catch블럭의 괄호()에 선언된 참조변수를 통해 이 인스턴스에 접근할 수 있다. 이 참조변수는 선언된 catch블럭 내에서만 사용가능하다!
printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(0/0); // 예외발생!!!
System.out.println(4); // 실행되지 않는다.
} catch (ArithmeticException ae) {
ae.printStackTrace();
System.out.println("예외메시지 : " + ae.getMessage());
} // try-catch의 끝
System.out.println(6);
여기서 중요한것은 예외가 발생하면 예외객체가 만들어진다는것! 그리고 catch문안의 참조변수를 통해 생성된 예외 인스턴스 ( 여기서는 ArithmeticException ) 에 접근할 수 있다!
실행을 하면
java.lang.ArithmeticException : / by zero (예외 발생한 이유!)
at Ex8_5.main(Ex8_5.java:8) (예외 발생한 위치!)
예외메시지 : / by zero
가 나오는데 발생한 이유와 위치등을 상세히 알 수 있다. 이처럼 try-catch문으로 예외처리를 하여 예외가 발생해도 비정상적으로 종료하지 않도록 해주는 동시에, printStackTrace() 또는 getMessage()와 같은 메서드를 통해서 예외의 발생 원인을 알 수 있다.
'JAVA > 예외처리' 카테고리의 다른 글
finally블럭 (0) | 2022.02.09 |
---|---|
메서드에 예외 선언하기 (0) | 2022.02.08 |
예외 발생시키기 (0) | 2022.02.08 |
멀티 catch 블럭 (0) | 2022.02.08 |
예외처리(exception handling) (0) | 2022.02.08 |