티스토리 뷰

목표

자바의 예외 처리에 대해 학습하기

 

학습할 것

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

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

  • Exception과 Error의 차이

  • RuntimeException과 RuntimeException이 아닌 것의 차이

  • 커스텀한 예외를 만드는 방법

 

1. 자바에서 예외를 처리하는 방법 (try, catch, throw, throws, finally)

예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다.예외에는 두 가지 종류가 있는데 하나는 일반 예외(Exception)이고, 다른 하나는 실행 예외(Runtime Exception)이다.

 

  • 일반 예외 : 컴파일러 체크 예외라고도 하며 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사
  • 실행 예외 : 컴파일하는 과정에서 예외 처리를 검사하지 않는 예외

컴파일 시 예외 처리를 확인하는 차이일 뿐 두 가지 예외는 모두 예외 처리가 필요하다.

 

 

프로그램에서 예외가 발생했을 경우 갑작스러운 종료를 막고 정상적으로 실행될 수 있도록 처리하는 것을 예외 처리라고 한다.

 

예외 처리 코드는 try-catch-finally 블록을 이용하게 되는데 이 블록의 경우 생성자 내부와 메서드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.

public class TryCatchFinallyExample {
   public static void main(String[] args) {
    	String data = null;
        try {
        	data = args[0];
        } catch(ArrayIndexOutOfBoundsException e) {
        	System.out.println("ArrayIndexOutOfBoundsException");
        }
        
        try {
        	int value = Integer.parseInt(data);
            System.out.println(data);
        } catch(NumberFormatException e) {
        	System.out.println("NumberFormatException");
        } finally {
        	System.out.println("Please try again.");
        }
    }
}

try-catch-finally 블록에서 try 블록에는 예외 발생 가능 코드가 위치하게 된다.try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드가 실행된다.

 

만약 try 블록에서 예외가 발생하면 실행을 멈추고 catch 블록으로 이동해 예외 처리 코드를 실행하고 finally 블록 코드를 실행한다.try-catch 블록만으로 예외 처리가 가능하지만 항상 실행할 내용이 있을 경우에는 finally 블록을 작성해주면 된다.

 

메소드메서드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리할 수 있지만 경우에 따라 메서드를 호출한 곳으로  예외를 떠넘길 수도 있다. 이때 사용할 수 있는 키워드가 throws이다.

 

throws 키워드는 메소드 선언부 끝에 작성되어 메서드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.여러 가지 예외를 처리하고 싶을 경우에는 throws 키워드 뒤에 떠넘길 예외 클래스를 쉼표로 구분해 나열하면 된다.

 

throws 키워드가 붙어있는 메서드는 반드시 try 블록 내에서 호출되어야 하며 catch 블록에서 떠넘겨 받은 예외를 처리한다.throws 키워드를 활용해 예외 처리를 떠넘길 때 main() 메서드에서도 throws 키워드를 사용해 예외를 떠넘길 수 있는데 이러한 경우 JVM이 최종적으로 예외 처리를 하게 된다. 하지만 이러한 방법은 권장하지 않는다.

public class ThrowsExample {
    public static void main(String[] args) {
    	try {
        	findClass();
        } catch(ClassNotFoundException e) {
        	System.out.println("클래스가 존재하지 않습니다.");
        }
    }
    
    public static void findClass() throws ClassNotFoundException {
    	Class clazz = Class.forName("java.lang.String2");
    }
}

 

사용자 정의 예외 또는 자바 표준 예외를 발생시키기 위해서는 throw 키워드를 사용할 수 있다.

throw new XXXException();
throw new XXXException("메시지");

예외 객체를 생성할 때는 기본 생성자 또는 예외 메시지를 갖는 생성자로 2가지 방법으로 사용할 수 있다.예외 발생 코드를 가지고 있는 메소드는 메서드 내부에서 try-catch 블록으로 예외를 처리할 수 있지만 대부분 자신을 호출한 곳에서 처리하도록 throws 키워드로 예외를 떠넘긴다.

public class BalanceInsufficientException extends Exception {
    public BalanceInsufficientException() { }
    public BalanceInsufficientException(String message) {
    	super(message);
    }
}
public class Account {
    private long balance;
    
    public Account() {}
    
    public long getBalance() {
    	return balance;
    }
    
    public void deposit(int money) {
    	balance += money;
    }
    
    public void withdraw(int money) throws BalanceInsufficientException {
    	if(balance < money) {
        	throw new BalanceInsufficientException("잔고부족:"+(money-balance)+" 모자람");
        }
        balance -= money;
    }
}

 

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

simplilearn, What is Exception Handling in Java?,
www.simplilearn.com/tutorials/java-tutorial/exception-handling-in-java

 

3. Exception과 Error의 차이

컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러(error)라고 한다.에러는 JVM 실행에 문제가 생겼다는 것으로 JVM 위에서 실행되는 프로그램을 잘 만들더라도 실행이 되지 않게 된다.

 

그러므로 개발자는 이러한 에러에 대처할 방법이 없게 된다. 자바에서는 에러 이외에 예외(exception)라고 부르는 오류가 있다.예외의 경우 사용자의 잘못된 조작이나 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류이다.예외가 발생하면 프로그램이 종료된다는 점에서 에러와 동일하지만 예외는 예외 처리를 통해 정상 실행 상태가 유지되도록 할 수 있다.

 

4. RuntimeException과 RuntimeException이 아닌 것의 차이

앞서 말했듯이 예외에는 일반 예외와 실행 예외가 존재하는데 일반 예외는 Exception 클래스를 상속받지만 Runtime Exception을 상속받지 않은 클래스들이고 실행 예외는 RuntimeException을 상속받은 클래스들이다.

 

RuntimeException 역시 Exception을 상속받지만 JVM은 RuntimeException을 상속했는지 여부를 보고 실행 예외를 판단한다.

 

실행 예외는 자바 컴파일러가 체크를 하지 않기 때문에 개발자의 경험에 의해 예외 처리 코드를 작성해야 한다.

만약 개발자가 예외 처리 코드를 넣지 않았을 경우, 해당 예외가 발생하면 프로그램은 바로 종료된다. 

 

자바 프로그램에서 자주 발생되는 대표적인 RuntimeException은 다음과 같다.

 

  • NullPointerException
  • ArrayIndexOutOfBoundsException
  • NumberFormatException
  • ClassCastException

 

5. 커스텀한 예외를 만드는 방법

커스텀한 예외의 경우, 컴파일러가 체크하는 일반 예외로 선언할 수 있고 컴파일러가 체크하지 않는 실행 예외로 선언할 수 도 있다.

 

일반 예외로 선언할 경우 Exception을 상속하면 되고, 실행 예외로 선언할 경우에는 RuntimeException을 상속하면 된다.

커스텀한 예외를 만들 때 예외 클래스 이름의 경우 Exception으로 끝나는 것이 좋다.

public class XXXException extends [ Exception | RuntimeException ] {
    public XXXException() { }
    public XXXException(String message) { super(message); }
}

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/09   »
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
글 보관함