바트심슨으로 하루만 살고 싶다
Java (try catch 구문) 본문
try catch 구문이란?
예외 처리를 하기 위한 구문
try {
//예외발생할 가능성이 있는 문장
}catch(Exception1 e1) {
//Exception1이 발생했을 경우, 이를 처리하지 위한 문장적는다.
//보통 이곳에 예외메세지를 출력하고 로그로 남김.
}catch(Exception2 e2) {
//Exception2이 발생했을 경우, 이를 처리하지 위한 문장적는다.
}catch(ExceptionN eN) {
//ExceptionN이 발생했을 경우, 이를 처리하지 위한 문장적는다.
}finally{
//예외발생여부에 관계없이 상항 수행되어야 하는 문장적는다.
}
try 문에서 Exception 예외가 발생할 경우 catch (Exception e) 로 넘어가서 그 안의 실행문 실행
finally 블럭은 try-catch문과 함께 예외 발생 여부와 관계없이 항상 무조건 실행되는 코드
( do-while 문의 do 구문과 비슷)
필수로 적어야 하는 부분은 아니며 선택적으로 사용한다.
try - catch 플로우
- 예외가 try 블럭에서 발생한 경우
- 발생한 예외와 일치하는 catch 문이 있는지 확인.
- 일치하는 catch 문이 있다면 catch 블럭 내의 문장을 모두 실행하고 try catch 문을 빠져나가서 그다음 문장을 수행.
- 일치하는 catch 문이 없다면 예외는 처리되지 못하고 에러 발생.
- 예외가 try 블럭 안에서 발생하지 않은 경우
- catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속
- 예외가 try 블럭 밖에서 발생한 경우
- 예외는 아무 처리되지 못한 채 에러 발생.
Try-catch블럭에서 예외 발생시, 예외가 발생한 위치 이후에 있는 try블럭의 문장들은 수행되지 않으므로,
try블럭에 포함시킬 코드의 범위를 잘 선택해야한다.
예시
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.println("첫번째 수 입력");
int a = sc.nextInt();
System.out.println("연산자 입력");
char b = sc.next().charAt(0);
System.out.println("두번째 수 입력");
int c = sc.nextInt();
switch (b) {
case '*':
if (a == 0 || c == 0) {
throw new Exception("둘 다 0이면 안됨");
} // 예외를 던진다
System.out.println(a * c);
break;
case '/':
if (c==0) {
throw new Exception("분모는 0이면 안됨");
}
System.out.println(a/c);
break;
}
} catch(Exception e) {
System.out.println(e.getMessage());
} //getMessage() 는 try에서 던진 예외가 출력된다고 생각
}
}
// 정상 출력
첫번째 수 입력
10
연산자 입력
*
두번째 수 입력
10
100
// 첫번째 catch 블럭의 조건에 반할 때
첫번째 수 입력
0
연산자 입력
*
두번째 수 입력
5
둘 중 하나라도 0이면 안됨
// 두번째 catch블럭의 조건에 반할 때
첫번째 수 입력
10
연산자 입력
/
두번째 수 입력
0
분모는 0이면 안됨
Catch 블럭.
catch (AuthException e) {
e.printStackTrace(); //예외정보 출력
log.error("AuthException ERROR: {} ", e.getMassage()); //로그남김
throw e; //예외 던지기
} catch (Exception e ) {
e.printStackTrace();
log.error("Exception ERROR: {} ", e.getMassage());
throw e;
}
괄호( )와 블럭{ } 두 부분으로 구분되어 있다.
괄호( )에는 처리하고자하는 예외타입(Exception), 참조변수(e)를 선언한다.
- 예외발생시 발생예외에 해당하는 클래스의 인스턴스가 생성
- 예를 들어 AuthException이 발생한다고 하면 AuthException인스턴스가 생성
- try블럭내에서 이 예외가 발생했다면, 이를 처리할 수 있는 catch 블럭이 있는지 확인
이때, AuthException 을 처리하는 catch블럭이 없다면, 예외가 처리되지 못해 에러를 발생시키기 때문에
모든 예외클래스는 catch블럭 괄호에 Exception e 를 선언해 놓으면 어떤 종류의 예외가 발생하더라도
이 catch블럭에 의해서 처리가 된다.
( 우리가 모든 Exception을 암기하고 있는것 보다 편리하다. )
그래서 보통 마지막 catch블럭에 Exception e를 선언한다.
예시같은 경우에는 두번째 catch블럭에서 AuthException을 제외한 모든 예외가 처리되는 것이다.
*getMessage()
: 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있음.
오류에 대한 기본적인 내용을 알수 있지만 상세하지 않다.
*printStackTrace()
: 예외발생당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메세지를 콘솔화면에 출력한다. getMessage 와는 다르게 printStackTrace는 리턴값이 없다. 이 메소드를 호출하면 메소드가 내부적으로 예외 결과를 화면에 출력한다. printStackTrace는 가장 자세한 예외 정보를 제공한다.
java.lang.AuthException:
at org.opentutorials.javatutorials.exception.Calculator.divide(CalculatorDemo.java:11)
at org.opentutorials.javatutorials.exception.CalculatorDemo.main(CalculatorDemo.java:25)
.
.
예외 던지기
*throw e
throw 키워드를 사용해 프로그래머가 고의로 예외를 발생 시킬 수 있다.
1. try안에서 연산자 new를 이용해서 발생시키려는 예외클래스의 객체생성.
2. 키워드 throw를 사용해서 생성한 예외를 catch로 던진다.
3. catch 에서 던진 예외를 잡아서 확인 또는 처리한다.
'Java > Java' 카테고리의 다른 글
Java (set 인터페이스 - HashSet, TreeSet) (0) | 2022.12.30 |
---|---|
11. Java ( 입출력과 스트림 ) (0) | 2022.12.05 |
Java(버블정렬 - 올림차순 정렬) (0) | 2022.11.29 |
10. Java( 전역변수 , 지역변수) (0) | 2022.11.29 |
9. Java (메소드) (0) | 2022.11.29 |