티스토리 뷰

반응형

[Java의 정석 - http://www.yes24.com/Product/Goods/24259565]

 

1. 예외처리(exception handling)

1.1 프로그램 오류

  • 컴파일 에러(compile-time error) : 컴파일 시에 발생하는 에러
  • 런타임 에러(runtime error) : 실행시에 발생하는 에러
  • 논리적 에러(logical error) : 실행은 되지만 의도와 다르게 동작하는 것

 

  • 에러(error)
    • 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 발생하면 복구할 수 없는 심각한 오류
    • 발생하면 프로그램의 비정상적인 종료를 막을 수 없음
  • 예외(exception)
    • 발생하더라도 수습될 수 있는 비교적 덜 심각한 오류
    • 발생하더라도 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 있음

1.2 예외 클래스의 계층구조

  • 예외 클래스들은 두 그룹으로 나눌 수 있음
    • Exception class와 그 자손들(RuntimeException과 자손들 제외)
      • 주로 외부의 영향으로 발생할 수 있는 것들
      • 프로그램 사용자들의 동작에 의해서 발생하는 경우가 많음
      • 종류
        • FileNotFoundException
        • ClassNotFoundException
        • DataFormatException
    • RuntimeException 클래스와 그 자손들
      • 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외들로 주로 자바의 프로그래밍 요소들과 관계가 깊음
      • 종류
        • ArrayIndexOutOfBoundException
        • NullPointerException
        • ClassCastException
        • ArithmeticException

1.3 예외처리하기 - try-catch문

  • 예외처리(exception handling)
    • 정의 : 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
    • 목적 : 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것
try {
	// 예외가 발생할 가능성이 있는 문장들을 넣는다
} catch (Exceptione1) {
	// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다
} catch (Exceptione2) {
	// Exception2이 발생했을 경우, 이를 처리하기 위한 문장을 적는다
} catch (Exceptione3) {
	// Exception3이 발생했을 경우, 이를 처리하기 위한 문장을 적는다
}
  • try-catch 문
    • 발생한 예외의 종류와 일치하는 단 한개의 catch 블럭만 수행되며 발생한 예외의 종류와 일치하는 catch 블럭이 없으면 예외는 처리되지 않는다
    • catch 블럭의 괄호 내에 선언된 변수는 catch 블럭 내에서만 유효하다

1.4 try-catch문에서의 흐름

  • try 블럭 내에서 예외가 발생한 경우
    • 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다
    • 일치하는 catch 블럭을 찾게 되면 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch 문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch 블럭을 찾지 못하면 예외는 처리되지 못한다
  • try 블럭 내에서 예외가 발생하지 않은 경우
    • catch 블럭을 거치지 않고 전체 try-catch 
  • try 블럭에서 예외가 발생하면 예외가 발생한 위치 이후에 있는 try 블럭의 문장들은 수행되지 않으므로 try 블럭에 포함시킬 코드의 범위를 잘 선택해야 한다

1.5 예외의 발생과 catch 블럭

  • catch 블럭의 괄호 내에는 처리하고자 하는 예외와 같은 타입의 참조변수 하나를 선언해야 한다
    • try 블럭에서 예외가 발생하면 catch 블럭을 차례대로 내려가면서 catch 블럭의 괄호 내에 선언된 참조변수와 생성된 예외클래스의 인스턴스에 instanceof 연산자를 이용해서 검사한다
      • 검사 결과가 true인 catch 블럭을 만날 때까지 검사는 계속된다
    • 모든 예외 클래스는 Exception 클래스의 자손이므로 catch 블럭의 괄호에 Exception을 선언해놓으면 모든 종류의 예외를 처리할 수 있다
  • printStackTrace()와 getMessage()
    • printStackTrace()
      • 예외 발생 당시의 호출스택(call stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다
    • getMessage()
      • 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다
  • 멀티 catch 블럭
    • catch(ExceptioneA e1) { } catch(ExceptionB e2) { } => catch(ExceptionA || ExceptionB e) { }
    • '|' 기호로 연결된 예외 클래스가 조상과 자손의 관계에 있다면 컴파일 에러가 발생한다
      • 그냥 조상 클래스만 쓰는거랑 똑같아서
    • '|'기호로 연결된 예외 클래스들의 공통 분모인 조상 예외 클래스에 선언된 멤버만 사용할 수 있다

1.6 예외 발생시키기

Exception e = new Exception("에러");	// 연산자 new를 사용해서 발생시키려는 예외 클래스의 객체를 만든 다음
throw e;	// 키워드 throw를 이용해서 예외를 발생시킨다
  • checked 예외
    • Exception 클래스와 그 자손 클래스 예외가 발생할 가능성이 있는 문장들에 대해 예외처리를 해주지 않으면 컴파일조차 되지 않는다
  • unchecked 예외
    • RuntimeException 클래스와 그 자손 클래스 예외는 프로그래머에 의해 실수로 발생하는 것들이기 때문에 예외처리를 강제하지 않는다

1.7 메서드에 예외 선언하기

  • 메서드의 선언부에 키워드 throws를 사용해서 메서드 내에서 발생할 수 있는 예외를 적어준다
    • 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것
  • 메서드의 선언부에 메서드에서 발생할 수 있는 예외를 명시함으로써 메서드를 사용하는 쪽에 이에 대한 처리를 강요하기 때문에 견고한 프로그램 코드를 작성할 수 있도록 도와준다
  • 메서드에 예외를 선언할 때 일반적으로 RuntimeException클래스들은 적지 않는다
    • 보통 반드시 처리해주어야 하는 예외들만 선언한다

1.8 finally 블럭

  • finally 블럭 : 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용됨
    • try-catch 문의 끝에 선택적으로 덧붙여 사용할 수 있음
    • try-catch-finally 순서로 구성
      • 예외 발생 : try -> catch -> finally 순으로 실행
      • 예외 발생하지 않음 : try -> finally 순으로 실행
    • try 블럭이나 catch 블럭에서 중간에 return 문을 만나도 finally 블럭이 실행된 후에 메서드가 종료된다

1.9 자동 자원 반환 - try-with-resources 문

  • 입출력에 사용되는 클래스 중 사용한 후에 꼭 닫아줘야하는 것들이 있음(자원(resources) 반환 때문)
  • ty-catch에서 finally에서 close()를 실행해도 거기서 예외를 발생할 수 있기 때문에 try-with-resources 문 사용
  • try 괄호 안에 객체를 생성하는 문장을 넣으면 이 객체는 따로 close()를 호출하지 않아도 try 블럭을 벗어나는 순간 자동적으로 close()가 호출됨

1.10 사용자정의 예외 만들기

  • Exception 클래스나 RuntimeException 클래스나 다른 예외 클래스로부터 상속받아 새로운 예외 클래스를 만들 수 있다
    • String을 매개변수로 받는 생성자를 추가해 메시지 저장하는 에외 클래스를 만들 수 있다
    • RuntimeException 클래스를 상속받아 예외처리를 선택적으로 할 수 있도록하는게 추세(uncheked 예외를 더 선호)

1.11 예외 되던지기(exception re-throwing)

  • 예외 되던지기(exception re-throwing)
    • 메서드에서 발생한 예외를 메서드 내에서 try-catch 문으로 처리할 수도 있고 메서드 선언부에 지정하여 호출한 메서드에서 처리할 수도 있다
    • 예외가 발생할 가능성이 있는 메서드에서 try-catch 문을 사용해서 예외를 처리해주고 catch 문에서 필요한 작업을 핸한 후에 throw 문을 사용해서 예외를 다시 발생시킨다
      • 다시 발생한 예외는 이 메서드를 호출한 메서드에게 전달되고 호출한 메서드의 try-catch 문에서 예외를 또다시 처리한다
    • 예외가 발생한 메서드와 이를 호출한 메서드 양쪽 모두에서 처리해줘야 할 작업이 있을 때 사용

1.12 연결된 예외(chained exception)

  • 한 예외가 다른 예외를 발생시킬 수도 있음
  • Throwable initCause(Throwable cause) :지정한 예외를 원인 예외로 등록
  • Throwable getCuase() : 원인 예외를 반환
  • 사용하는 이유
    • 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해
    • checked 예외를 unchekced 예외로 바꿀 수 있도록 하기 위해

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 31
글 보관함