본문 바로가기

IT/JAVA

자바 예외처리 - 백기선님 스터디 9주차 과제

목표

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

학습할 것 (필수)

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

예외처리란?

  • 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것이다.
  • 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것이 목표이다.
  • 처리되지 못한 예외가 발생하면 프로그램은 비정상적으로 종료된다.
  • 처리되지 못한 예뇌는 JVM의 예외처리기가 받아서 예외 원인을 화면에 출력한다.

자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

 

try-catch

  • 하나의 try블럭 다음에는 하나 이상의 catch블록이 올 수 있다.
  • 발생한 예외의 종류와 일치하는 단 한개의 catch블록만 수행된다. 
  • 발생한 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.

try-catch문에서의 흐름

  • try블럭 내에서 예외가 발생한 경우
  1. 발생한 예외와 일치하는 catch블록을 찾는다.
  2. 일치하는 catch블럭을 찾게 되면, 해당 블록 내이 문장들을 수행하고 전체 try-catch문을 빠져나간다.
  • 예외가 발생하지 않을 경우
  1. catch블럭은 수행되지 않는다.

 

try{
    // 예외가 발생할 가능성이 있는 문장들을 넣는다.
}
catch(ArithmeticException e1){
	// ArithmeticException이 발생했을 경우, 처리하는 문장을 작성한다.
}
catch(Exception e2){
	// ArithmeticException을 제외한 모든 예외가 발생했을 경우, 처리하는 문장을 작성한다.
}

 

모든 예외 클래스는 Exception 클래스의 자식이므로 catch의 예외 타입을 Exception으로 작성하면 모든 예외를 처리할 수 있다.

 

throw

throw 키워드를 사용하여 프로그래머가 고의로 예외를 발생시킬 수 있다.

try{
	Exception e = new Exception("예외 발생!");
	throw e;
}
catch(Exception e)
{
	System.out.println("에러 메세지: " + e.getMessage());
}

--실행결과--

에러 메세지: 예외 발생!

 

Exception 인스턴스를 생성할 때, 생성자에 String을 넣어주면 이 String이 Exception 인스턴스에 메시지로 저장된다.

이러한 성격을 이용하여 자바에 정의되어있지 않은 케이스를 예외로 지정해 예외를 발생하고 메세지를 전달할 수 있다.

 

throws

thorws 키워드를 메서드 선언부에 작성함으로써 메서드 내에서 발생할 수 있는 예외를 선언할 수 있다. 여러 개의 예외를 선언하려면 쉼표(,)로 구분한다.

void method() throws Exception1, Exception2, ⋯ ExceptionN{
	// 메서드 내부
}

메서드 선언부에 예외를 선언함으로써 이 메서드를 사용하기위해 어떠한 예외들이 처리되어야 하는지 쉽게 알 수 있다.

throsw Exception으로 선언할 경우 모든 종류의 예외가 발생할 가능성이 있다. (선언한 예외뿐 아니라 자식 타입의 예외도 발생할 수 있다는 뜻이다.)

이렇게 선언된 예외들은 해당 메서드에서 처리되는 것이 아니라, 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡긴다.

예외를 전달받은 메서드가 또다시 자신을 호출한 메서드에게 전달할 수 있드며, 이런 식으로 계속 전달되다 마지막 main메서드에서도 예외가 처리되지 않으면 프로그램 전체가 종료된다.

 

finally

try-catch문의 끝에 선택적으로 덧붙일 수 있드며, 예외의 발생 여부와 상관없이 실행되어야 할 코드를 포함한다.

try{
	// 예외 발생 가능성이 있는 문장들..
}
catch (Exception1 e1){
	// Exception1 발생 시 수행되는 문장들
}
finally{
	// Exception1 발생과 상관없이 수행되는 문장들
        // finally 블럭은 try-catch 문의 맨 마지막에 위치해야한다.
}

 

 

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

모든 예외의 최고 조상은 Exception 클래스이며 모든 클래스의 조상은 Object 클래스이므로 Exception클래스 역시 Object클래스의 자식 클래스이다.

위 그림과 같이 예외 클래스는 RuntimeException클래스와 RE가 아닌 것들로 나눌 수 있다.

둘의 차이점은 아래 RuntimeException과 RE가 아닌 것의 차이는?에서 설명하겠다.

 

Exception과 Error의 차이는?

Error  프로그램 코드에 의해서 수습될 수 없는 심각한 오류
Exception  프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

Error는 메모리 부족, 스택오버플로우와 같이 발생하면 복구할 수 없는 심각한 오류이므로 프로그램의 비정상적인 종료를 막을 수 없다.

Exception은 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 잆다.

 

RuntimeException과 RE가 아닌 것의 차이는?

RuntimeException  프로그래머의 실수로 발생하는 예외
RE가 아닌 것들 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

 

RuntimeException클래스들은 주로 프로그래머의 실수에 의해 발생될 수 있는 예외이다. 

RE가 아닌 클래스들은 주로 외부의 영향으로 발생할 수 있는 예외이다.

두 예외의 예시는 아래와 같다.

RuntimeException  ArrayIndexOutOfBoundsException 배열의 범위를 벗어난 경우
NullPointerException 값이 null인 참조 변수의 멤버를 호출
ClassCastException 클래스간 형변환을 잘못한 경우
ArithmeticException 정수를 0으로 나누려고 한 경우
RE가 아닌 것들 FileNotFoundException 존재하지 않는 파일 이름을 입력한 경우
ClassNotFoundException 클래스의 이름을 잘못 적은 경우
DataFormatException 입력한 데이터 형식이 잘못된 경우

 

커스텀한 예외 만드는 방법

 

기존의 정의된 예외 클래스 외에 필요에 따라 새로운 예외 클래스를 정의하여 사용할 수 있다.

Exception 클래스를 상속받거나 필요에 따라 알맞은 예외 클래스를 상속받아 만든다. 생성자와 멤버를 추가함으로써 예외를 원하는 방식으로 만들어 사용할 수 있다. 

class NewException extends Exception {
	NewException(String msg){
    	super(msg);
    }
}

 

 

Reference)

자바의 정석 - 남궁 성