바트심슨으로 하루만 살고 싶다

Java (try catch 구문) 본문

Java/Java

Java (try catch 구문)

바트심슨바게트 2022. 11. 29. 19:35

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 블럭에서 발생한 경우

  1.  발생한 예외와 일치하는 catch 문이 있는지 확인. 
  2.  일치하는 catch 문이 있다면 catch 블럭 내의 문장을 모두 실행하고 try catch 문을 빠져나가서 그다음 문장을 수행.
  3.  일치하는 catch 문이 없다면 예외는 처리되지 못하고 에러 발생.

- 예외가 try 블럭 안에서 발생하지 않은 경우

  1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속 

- 예외가 try 블럭 밖에서 발생한 경우

  1.  예외는 아무 처리되지 못한 채 에러 발생.

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)를 선언한다.

  1. 예외발생시 발생예외에 해당하는 클래스의 인스턴스가 생성
  2. 예를 들어 AuthException이 발생한다고 하면 AuthException인스턴스가 생성
  3. 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
Comments