Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[2주차] 52. 예외처리, try - catch - (finally) 구문 본문

K-DigitalTraining 강의/1. Java

[2주차] 52. 예외처리, try - catch - (finally) 구문

이대곤 2022. 6. 1. 18:57

* 예외(Exception)처리란?

  에러에는 컴파일 중 발생하는 '컴파일에러'와 실행 중 발생하는 '런타임에러'가 있다.
  '컴파일에러' 는 코드상의 오타 등의 에러이고,
  '런타임에러'는 배열에서 크기를 벗어난 접근을 하는 것과 같은 에러이다.
  그런데 '런타임에러'에는 '에러'와 '예외'가 존재한다.

  '에러'는 메모리 부족 등의 프로그램 코드에 의해 수습될 수 없는 오류이고

  '예외'는 프로그램 코드에서 수습될 수 있는 다소 미약한 오류이다.

  try-catch문이 다루는 예외는 바로 이것이다. '런타임에러'에 속하는 '예외'

 

* 예외(Exception)처리를 왜 해주는가?

  프로그램 실행시 예외가 발생하게 되면 프로그램이 강제로 비정상 종료되어 버리는데,

  발생할 수 있는 예외에 대비한 코드를 작성해두면 도중에 종료되는 것 없이 실행상태를 유지할 수 있다.

 

* 예외 객체가 생성되는 타이밍

  실행중에 예외가 발생하면 그자리에서 갑자기 new  (ArithmeticException) 하며 예외 객체가 생성된다.

 

* try - catch - (finally) 에서 알아야할 흐름

  try안에 발생할 예외가 10개 있어도 처음 발생한 예외 딱 1개만 처리하고 이를 벗어난다.

  예외 발생시 예외 처리 후 다음줄을 처리하기 위해 다시 그 자리로 되돌아 오지 않는 것이다.

  catch문은 예외가 발생할 경우에만 가게되며, 예외에 따라 처리 방식을 다르게 하기 위해 여러개가 존재할 수 있다.
  맨 위의 catch 문 부터 예외 객체와 참조변수 타입이 일치하는 지를 차례대로 비교하며 일치할 때 까지 내려간다.
  일치하는걸 찾았다면 다음 catch 문으로 넘어가지 않는다.
  추가적으로 fianlly문을 넣을 수 있는데, 넣어줘도 되고, 안넣어줘도 된다.
  finally문은 예외가 발생하여 catch를 간 경우에만 catch 부분 처리한 다음에 들리게 되는 흐름이다.

 

* 대부분의 예외 클래스는 Exception을 상속받아 만들어졌기 때문에 다형성에 의해 Exception 타입의 참조변수로
  모든 예외 객체를 받을 수 있다. 이 때문에 catch문에서 Exception 를 사용하게될경우 맨 아래서 사용하는게 좋다.

   ex) Exception e = new ArithmeticException

try{

} catch(..){ 

} catch(Exception e){ // Exception e = (Exception)new ArithmeticException()

}

코드


public class Ex07_01_예외처리 {
	public static void main(String[] args) {

		try {

			String str = null; // str은 String클래스의 참조변수

			System.out.println(str);
			System.out.println();

			System.out.println(str.length()); // 예외가 발생해 자동으로 new NullPointerException 예외 객체가 생성됨.

			System.out.println("예외가 위에서 발생해 여기까지 오지 못함");

			// 아래서 e는 NullPointerException 클래스 타입의 참조변수임
		} catch (NullPointerException e) { // if (e == NullPointerException) 비교문임
			System.out.println("예외 발생해서 오게된 catch문");
		} finally { // 있어도 되고 없어도 되는 finally, 예외가 발생해야지만 catch문을 거쳐 올 수 있는 곳임
			System.out.println("예외 발생해서 catch를 지나 오게된 fianlly 부분");
		}
	}
}

실행결과

null

예외 발생해서 오게된 catch문
예외 발생해서 catch를 지나 오게된 fianlly 부분
 
 
 
Comments