본문 바로가기

[STUDY] 자바_whiteship :)

9주차 과제: 예외 처리

목표

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

학습할 것 (필수)

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

스터디전 자바의 예외처리에 대해 알고있는것.
  • try-catch : try문 안에서 예외가 발생할경우 catch의 파라미터에 정의된 exception에 해당하는경우 catch문에서 처리되고 다음 소스코드를 진행한다. exception의 성격에 따라 분기해서 처리 가능하며, exception의 로그를 확인할 수 있다.(e.getTrackMessage()??)

  • throws : 예외를 해당 메서드를 호출한 메서드로 던지는것. 예외발생직후 return되며 다음 소스코드는 실행되지 않는다.

제대로 알고있는지, 모르고 있었던것은 무엇인지 확인해보자.

 

예외는 무엇인가?

프로그램 실행 중 오작동하거나 비정상적으로 종료되는 경우 이를 발생시킨 원인을 프로그램에러 또는 오류라고 한다.

발생시점에 따라,

  • 컴파일에러 (Complie Error): 컴파일 시에 발생하는 에러

  • 런타임에러 (Runtime Error) : 프로그램 실행시 발생하는 에러

이중 실행시에 발생하는 프로그램 오류는 에러예외로 구분한다.

  • 에러(Error) : i.e, OutOfMemoryError, StackOverflowErr 등과 같이 수습될 수 없는 심각한 오류. 시스템레벨의 오류

  • 예외(Exception) : 코드에 의해 수습될 수 있는 오류, 개발자가 구현한 로직에서 발생한다. 즉 예외를 미리 예측하여 처리할 수 있다.

 

예외처리란 무엇인가?
  • 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것. 

  • 목적 : 프로그램의 비정상 종료를 막고 정상적인 실행상타를 유지하는 것. 

 

자바에서 제공하는 예외 계층구조
Object
    |  -- Trowable
               |    -- Error
               |    -- Exception
                            |    -- RuntionException   ... UncheckedExcepion
                            |    -- CheckedException

모든 예외 클래스는 Throwable  클래스를 상속받고 있으며, Throwable의 최상위 클래스 Object의 자식클래스이다.

Exception은 ChecekcdExeption과 UncheckedException으로 구분할 수 있으며, Exception 자식클래스중 RuntimeException은 UncheckedException, 그외의 exception은 CheckedException이라고 한다. 이를 구분하는 가장 큰 기준은 "꼭 처리를 해야하느냐" 이다. 

RuntimeException이외의 Exception이 발생할 가능성이 있는 코드는 반드시 예외처리를 해주어야 한다. 

 

CheckedException UncheckedException
반드시 예외 처리를 해야한다. 명시적인 처리를 강제하지 않음
컴파일단계에서 확인 실행단계에서 확인
IOException
FileNotFoundException
ClassNotFoundException
DataFormatException

외부적인 영향으로 발생할 수 있는 예외
RuntimeException 
   | -- ArithmeticException
   | -- NullPointerException 


실행중 발생되는 예외. 

 

 

예외처리방법 (try, catch, throw, throws, finally)

 

1. try - catch - finally

 

try-catch 블러낵에 포함된 문장이 하나여도 {}를 생략할 수 없다.

try 블럭 다음에 여러종류의 예외를 처리할 수 있도록 여러개의 catch블럭을 사용할 수 있다.

catch내에 또다른 try-catch블럭을 사용할 수 있다. (단, 상위catch문과 동일한 변수 사용불가)finally는 try블럭이 끝날때 ( exception 발생여부, return, continue, break등과 상관없이) 반드시 수행된다.finally블럭은 반드시 작성할 필요는 없다.

 

 

예제코드
결과

 

모든 예외 클래스는 Exception의 자손이므로 어떤 예외가 발생되어도 처리가 가능하다. 특정한 예외에 대한 처리가 필요하면 해당 Exception을 명시하는 것이 좋다.

예외발생시 정보를 볼수 있는 메서드(Throwable클래스에 정의되어 있다)

  • printStackTrace() : 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력

  • getMessage() : 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

java 1.7부터 멀티catch블럭 사용가능. catch문안에 (Exception1  | Exception2 e) 와 같이 작성 가능하다. 단 멀티로 작성한 예외가 조상과 자손관계이면 에러가 발생한다.

 

2. throw

throw키워드를 통해서 고의로 예외를 발생 시킬수 있다. 

 

3. throws

 

메서드 선언부에 throws키워드를 통해 해당 메서드를 호출한 메서드에게로 예외를 던진다. 예외를 선언함으로서 메서드를 사용할때 발생할수 있는 에러를 명시적으로 알수있다. 이때 예외는 해당메서드를 호출하는 어느곳에서든 한번은 try-catch로 처리해주어야 한다.

 

커스텀한 예외 만드는 법

Exception 클래스를 extends 받아 필요한 예외를 정의할 수 있다.

커스텀한 예외 생성 CustomException.java
커스텀한 예외 생성
결과

사용자정의 예외를 생성할때 uncheckedException 으로 생성하고자 한다면, RuntimeException을 extends 받아서 생성하면 된다.

 

 

알게된점

ChececkedException과 UncheckedException의 차이를 알게되었다.

사용자정의 예외를 작성하는법도 이번기회를 통해 알게되었다.

막연히 알고있던 점들을 확실히 정리하게되어 뿌듯:) 그리고 몇번하다보니 작성하는 방법도 정리되는거 같아서 좋다. 

 

 

참고사이트

Java 예외(Exception) 처리에 대한 작은 생각 | www.nextree.co.kr/p3239/ 

8. 예외처리 (Exception Handling) | rebeccacho.gitbooks.io/java-study-group/content/chapter8.html

나만의 예외 만들기 | edu.goorm.io/learn/lecture/41/%EB%B0%94%EB%A1%9C%EC%8B%A4%EC%8A%B5-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94-java/lesson/39283/%EB%82%98%EB%A7%8C%EC%9D%98-%EC%98%88%EC%99%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0