Java

[Java-10] 예외 처리(Exception)

zamezzz 2017. 2. 18. 21:41

 [Java-10] 예외처리 (Exception)


안녕하세요.


오늘은 JAVA의 예외처리에 대해서 알아보겠습니다.


순서는 아래와 같습니다!



■ 예외란?

■ 실행 예외의 종류

■ 예외 처리 코드

■ 예외 떠넘기기

■ 사용자 정의 예외



■ 예외란?


예외란 오류의 한 종류입니다.


사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 바로


예외(Exception)이라 합니다.


예외는 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있어요


그렇기에 예외 처리가 아주 중요하죠.


예외는 2가지 종류로 나뉠 수 있습니다.

- 실행 예외 (Runtime Exceptions)

- 일반 예외 (Exceptions) 



실행 예외(Runtime Exceptions)의 종류


실행 예외는 컴파일 과정에서 예외 처리 코드를 검사하지 않는 예외를 말합니다.


그렇기에 예외처리 코드를 삽입하는 것에 있어 조금은 까다로울 수 있습니다. 다만 많이 사용되는


실행 예외 처리 방법이 있으니 이를 익히는 것이 매우 중요합니다.


- NullPointerException

null값을 갖는 참조변수를 참조했을 때 발생합니다. 객체가 없는 상태에서 해당 객체를 사용

하려했으니 예외가 발생한 상황이죠.


- ArrayIndexOutOfBoundsException

배열에서 인덱스 범위를 초과하여 사용할 경우 발생합니다.


- NumberFormatException

문자열을 숫자로 변환하려고 할 때, 숫자로 변환될 수 없는 문자가 포함된 경우 발생합니다.


- ClassCastException

클래스 타입 변화가 가능한 관계가 아닐 때, 억지로 타입 변환을 시도할 경우 발생합니다.



■ 예외 처리 코드


위와 같은 예외 발생 시 프로그램의 갑작스런 종료를 막고, 정상 실행할 수 있도록 처리하는 


코드를 예외 처리 코드라고 합니다.


예외 처리 코드는 try-catch-finally 블록을 이용하여 작성합니다.



- try 블록에는 예외발생 가능 코드가 위치합니다. try블록의 코드가 정상적으로 실행이 된다면

  catch는 실행되지 않고 바로 finally블록으로 이동합니다.


- try블록에서 예외가 발생하면 즉시 실행을 멈추고 catch로 이동하여 예외처리 코드가 실행되요


- finally블록은 예외 발생과 상관 없이 항상 실행할 내용을 포함합니다. 생략이 가능합니다.


예를 들어, 아래와 같이 작성해주면 됩니다. (ArrayIndexOutOfBoundsException 경우)


try {

  //예외 발생 가능 코드 작성

  //ArrayIndexOutOfBoundsException 유도

} catch(ArrayIndexOutOfBoundsException e) {

  System.out.println("ArrayIndexOutOfBoundsException 발생");

} finally {

  System.out.println("다시 실행하세요");

}



■ 예외 떠넘기기 (throws)


예외 처리 중 필요에 따라 메소드를 호출한 곳으로 예외처리를 떠넘길 수 있습니다.


이따 사용하는 것이 바로 throws입니다.


이는 메소드의 선언부에서 선언되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘깁니다.


throws 사용법은 아래와 같습니다.


리턴타입 메소드명(매개변수, ...) throws 예외클래스 {

...

}


처리 순서를 그림으로 표현하면 아래와 같습니다.


아래 그림을 보시면 이해가 좀 더 쉬울 것 같네요.



method2()의 예외 처리를 메소드에서 하지 않고 호출한 부분으로 던지는 것인데요.


위의 그림을 보면 어디서 예외 처리를 하는지 쉽게 이해가 갑니다.



사용자 정의 예외


앞에서 정의한 예외 클래스 말고도, 개발자가 직접 정의해서 만들어야 하는 사용자 정의 예외가


존재합니다. 보통 사용자 정의 예외 클래스 이름은 Exception으로 끝납니다.


사용자 정의 예외 클래스를 만들고, 예외를 발생시키고, 이를 Main에서 사용하는 형태입니다.


첫 째, 예를 들어 TestException.java 클래스를 아래와 같이 만들어 보겠습니다.


public class TestException extends Exception {

  public TestException() {}

  public TestException(String message) {
    super(message);
  }
}

보통 생성자는 두 개를 생성합니다.


하나는 기본 생성자, 다른 하나는 예외 발생원인을 전달하기 위한 생성자입니다.


둘 째, 예외를 발생시키겠습니다.


public void testMethod(int a, int b) throws TestException {

  if(a > b) {

    throw new TestException("a가 더 크다");

  }

  a = b;

}


코드에서 예외를 발생시키는 방법은 throw를 사용합니다.


위와 같은 방법으로 사용하면 됩니다. 


그리고 발생한 예외는 메소드 자체에서 처리하는 것 보다는 호출한 부분에서 처리하도록


예외 떠넘기기(throws) 또한 사용했습니다.


셋 째, 예외 처리 예제를 사용하겠습니다.


실제 사용은 아래와 같이 합니다.


try {

  testMethod(10, 5);

} catch(TestException e) {

  String message = e.getMessage();

  System.out.println(message);

  e.printStackTrace();

}  


이렇게 사용하면, 실제 개발자가 직접 만든 TestException으로 예외처리를 할 수 있습니다.

간단한 예제이니 직접 해보시면 이해가 쉬우실 것입니다.



오늘은 예외 처리에 대해서 정리했습니다.


단순 if 조건문 등으로 예외 처리하는 것 이외에 java에서 제공하는 이러한 방법 또한 있으니


잘 살펴보시면 좋겠습니다.


감사합니다.

반응형

'Java' 카테고리의 다른 글

[Java-12] 람다식 (Lambda)  (0) 2017.03.11
[Java-11] 스트림 (Stream)  (0) 2017.03.02
[Java-9] 추상클래스, 추상메소드, 인터페이스  (0) 2017.02.12
[Java-8] 상속  (0) 2017.02.05
[Java-7] 클래스  (0) 2017.01.30