9주차 과제: 예외 처리


목표

자바의 예외 처리에 대해 학습하세요.

학습할 것 (필수)

  • 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
  • 자바가 제공하는 예외 계층 구조
  • Exception과 Error의 차이는?
  • RuntimeException과 RE가 아닌 것의 차이는?
  • 커스텀한 예외 만드는 방법

자바에서 예외처리 방법

자바 예외 처리는 try. catch, throw, throws, finally 다섯가지 키워드를 통해 관리됩니다. 우선 예외를 발생할 수 있는 문장은 try문 안에 배치 합니다 이 때 try블록 내에서 예외가 발생하면 catch에 인수로 받은 예외의 경우를 잡아내서 exception 객체를 만들고 catch문 안의 명령문을 실행합니다. 일련의 과정이 끝나고 예외 발생여부와 관계없이 반드시 실행되어야 하는 코드는 finally 블록 내부에 위치하여 무조건 실행하게끔 합니다.

시스템 생성예외는 java런타임 시스템으로 인해 자동으로 발생 합니다. 이것을 수동으로 발생시키려면 throws 키워드를 통해 던져서 예외 상황을 정의해 주어야 합니다.

자바가 제공하는 예외계층 구조

예외는 java.lang.Throwable 클래스의 하위 클래스로 존재 하며 에러 또한 같은 곳에 위치합니다.

Exception 아래에는 크게 RuntimeException과 RuntimeException이 아닌 예외로 나눌 수 있으며

우리가 흔히 접하는 예외들은 RuntimeException 아래에 포함된 경우가 많습니다.




Exception과 Error 


예외는 응용프로그램이 포착할 수 있는 문제사항으로 예외가 발생했을 때 예외 객체를 생성하여 문제사항을 명시 합니다. 프로그램이 종료될 수 있지만, try,catch 및 throw등의 키워드를 사용하여 복구할 수 있습니다. 

오류는 확인되지 않은 유형의 문제로 복구할 수 없습니다. 대부분 프로그램이 실행되는 환경으로 인해 발생하며, 런타임 시 발생합니다. 컴파일러에 알려져 있지 않아서 최대한 포착하지 않아야하는 심각한 문제를 나타냅니다.


RuntimeException과 아닌것의 차이


위의 도표에서 볼 수 있듯이, RuntimeException에는 아래와 같은 예외들이 포함돼 있습니다.


  • ArithmeticException 제로제산 등의 산술 예외 발생시
  • ArrayStoreException 배열에 부정한 형태의 오브젝트를 저장하고자 할때
  • [IllegalArgumentException] IllegalThreadStateException 쓰레드가 요구된 처리를 하기에 적합한 상태에 있지 않을때
  • [IllegalArgumentException] NumberFormatException 부적절한 문자열을 수치로 변환하고자 할때
  • IllegalMonitorStateException 모니터 상태가 부정일때 
  • IllegalStateException 메소드가 요구된 처리를 하기에 적합한 상태에 있지 않을때
  • [IndexOutOfBoundException] ArrayIndexOutOfBoundsException 범위 밖의 배열 첨자 지정시
  • [IndexOutOfBoundException] StringIndexOutOfBoundsException 범위 밖의 String 첨자 지정시
  • NegativeArraySizeException 음의 크기로 배열 크기를 지정하였을때
  • NullPointerException null 오브젝트로 접근했을때
  • SecurityException 보안 위반시
  • UnsupportedOperationException 지원되지 않는 메소드를 호출했을때


다른 예외들과의 차이는 컴파일 시 예외 처리 체크를 하느냐 안하느냐의 차이입니다. 예를 들어 IOException같은 경우는 꼭 try catch또는 throw를 통해 처리를 해주어야 오류없이 실행이 가능하지만 runtimeException에 포함된 예외들은 컴파일까지는 가능합니다. 왜냐면 이런 예외상황은 주로 개발자의 실수에 의해 일어나는 일로 예외로 던져주지 않더라도 개발자가 조금만 더 신경써서 다른 방법을 통해 검증 한다면 충분히 막을 수 있는 예외들이기 때문입니다. 이런 runtimeException이 포함된 예외들을 Unchecked Exception이라고 하며 비교적 개발편의성이 존재한다고 볼 수 있습니다. 


커스텀한 예외 만드는 방법

일반적으로 구현돼 있는 예외들로만 예외상황을 처리하다보면 정확한 원인이 무엇인지 모를 때가 있습니다. 이때 더 자세한 원인을 위해 사용자가 예외상황을 생성/지정 해줄 수 있습니다. 이는 클라이언트 단에 어떤 부분이 예외상황을 발생 시켰는지 알려주어 더 효율적인 예외상황해결에 도움이 될 수 있습니다.

커스텀한 예외를 만드려면 java.lang.Exception 클래스를 extends 해야합니다. 그리고 에러가 났을 때 반환해줄 메시지를 생성하고 부모 클래스 생성자를 호출 해줍니다. 

이런 커스텀 예외들은 이름만 보고도 어떤원인으로 발생했는지 쉽게 알 수 있는 장점도 있습니다. 다만 너무 많은 생성은 시스템에 부담이 되니 적절히 만들어서 재사용을 지향하는 것이 좋습니다. 

댓글

이 블로그의 인기 게시물

git-receive-pack not permitted on 깃 허브 로그인 관련 문제