[Java]예외 처리

정석용·2023년 4월 10일
0

Java

목록 보기
9/15
post-thumbnail

자바에서 예외 처리

사용자의 잘못된 조작이나 개발자의 코딩 실수로 인해 발생하는 프로그램 오류를 말한다. 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서 에러와 동일하나, 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.

모든 예외 클래스는 java.lang.Exception 클래스를 상속 받는다.

  • Exception 클래스 자체는 checked Exception 이다.
  • Exception 클래스는 Throwable 클래스의 자식 클래스이다.
  • Exception 클래스의 자식 클래스 중 RuntimeException 클래스는 Unchecked 이다.
  • 그 외 checked Exception이 있다.

예외 처리를 하는 이유
예외적인 상황을 대비하여 미리 안정장치를 하는 것
자바 프로그램에서는 예외 상황이 발생하면, 예외를 발생시킨다. 특히 unchecked exception 같은 예외는 프로그램 실행중이다가도 예외가 발생하면 강제 종료된다.
때문에 프로그램의 안정적인 운영에 있어서 예외는 필수이다.

try-catch
일반적으로 사용되는 예외 처리 방법이다. try 구문에는 예외 발생 가능성이 있는 문장을 넣어주고, catch 구문은 try 구문에서 예외가 발생하면 어떻게 처리를 할 것인지 작성한다.

EX.

try{ 예외 가능성 문장
	}catch(예외의 종류){
    발생시 처리 문장
    }

try

  • 예외 발생 가능성이 있는 문장을 묶어준다.

catch

  • 예외가 발생하면 처리할 문자.
  • 매개변수로는 예외의 종류를 둘 수 있으며, try 블록에서 발생한 예외 메세지나 객체를 인수로 받아 처리한다.
  • catch 블록에 아무런 내용을 작성해주지 않으며느 어디서 오류가 발생했는지 파악하기가 어렵기 때문에 특수한 상황이 아니라면 항상 로그를 남기는게 좋다.
  • 다중 catch 사용 가능.
  • | 를 통해 멀티 catch 사용 가능.

다중 catch 블록을 작성할 때 주의할점
상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다.

finally
finally 블록은 예외 여부와 상관없이 실행되며, 심지어 try블록과 catch블록에서 return문을 사용하더라도 실행된다. (생략 가능)

예외 떠넘기기

try-catch 블록으로 예외를 처리하는 것이 기본이다. 하지만 경우에 따라 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다. 이때 Throws 키워드를 사용한다.

Throw

예외를 강제로 발생시키는것이 바로 throw이다. 코드를 작성하는 프로그래머가 강제로 예외를 발생시키는 것.

throw new 발생시킬 예외

Throws

예외를 상위쪽으로 미루어 처리한다.
만들어진 메소드 throws 에 발생예외를 추가적으로 적어주면 되기 때문에 시간낭비가 적다.

throw를 사용하는 이유: 예외를 한번 더 처리하기 위함.

public class ThrowsExam {
    
    public static void main(String[] args){
        
        Map map = null;
        
        try{
            
            int num = convertToNum(map);
            
        }catch (NullPointerException | NumberFormatException e){
            
            System.out.println("예외 발생:"+e);
            
        }
    }
    
    public static int convertToNum(Map map) throws NullPointerException, NumberFormatException{
        
        int num = Integer.parseInt(map.get("str").toString());
        
        return num;
    }
}

실행결과.

예외 발생:java.lang.NullPointerException

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

예외에는 두 가지 종류가 있다. 일반 예외와 실행 예외가 있다.

일반예외
자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문에 컴파일러 체크 예외, check Exception라고도 한다.
실행 예외
컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외이기 때문에 unchecked Exception이라고 한다.

두 가지 예외는 모두 예외 처리가 필요하다. 자바에서는 예외를 클래스로 관리한다. JVM은 프로그램을 실행하는 중 예외가 발생하면 해당 예외 클래스로 객체를 생성한다. 그리고 예외 처리 코드에서 예외 객체를 이용할 수 있도록 한다. 모든 예외 클래스들은 java.lang.Exception 클래스를 상속받는다.

일반 예외 클래스 Exception 상속받지만, RuntimeException을 상속받지 않는 클래스이다.

실행 예외는 RuntimeException을 상속 받는 클래스들이다. 실행 예외는 자바 컴파일러가 체크를 하지 않기 때문에 오직 개발자의 경험에 의해서 예외 처리 코드를 삽입해야 한다.

실행 예외의 종류

  • NULLPointerException
    객체 참조가 없는 상태, 즉 NULL 값을 갖는 참조 변수로 객체 접근 연산자 도트(.)를 사용했을 때 발생.

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

  • ClassCastException
    타입 변환은 상위클래스와 하위 클래스 간에 또는 구현 클래스와 인터페이스 간에 발생.

  • NumberFormatException
    매개값인 문자열이 숫자로 변활될 수 있다면 숫자를 리턴하지만, 숫자로 변환될 수 없는 문자가 포함되어 있다면 발생.

커스텀 예외 만드는 방법

1.사용자 정의 예외 클래스 선언
컴파일러가 체크하는 일반 예외로 선언하거나, 컴파일러가 체크하지 않는 실행 예외로 선언 가능.

일반예외 : Exception
실행예외 : RuntimeException

  • 사용자 정의 예외 클래스 이름은 Exception 으로 끝나는 것이 좋다.
  • 사용자 정의 예외 클래스도 필드, 생성자, 메소드 선언을 포함할 수 있지만, 대부분 생성자 선언만 포함한다.
  • 생성자는 두 개를 선언하는 것이 일반적이다.
    (매개 변수가 없는 기본 생성자, 예외 발생 원인을 전달하기 위해 String 타입의 매개 변수를 갖는 생성자)

2.예외 발생시키기
throw 함수 사용
예외 객체를 생성 시 기본 생성자 또는 예외 메시지를 갖는 생성자 중 어떤 것을 사용해도 된다.
만약 catch 블록에서 예외 메시지가 필요하다면, 예외 메시지를 갖는 생성자를 이용한다.

따라서 Throws 키워드를 포함하고 있는 메소드는 호출 한 곳에서 아래와 같이 예외 처리를 해야 한다.

try{
	method();
} catch(XXXException e){
	//예외처리코드
}

3.예외 정보 얻기
매개 변수를 이용하면 예외 객체의 정보를 알 수 있다.
따라서 Exception이 가지고 있는 메소드들을 모든 예외 객체에서 호출할 수 있다.

자주 사용되는 메소드
getMessage(), printStackTrace()

예외(Exception)란 무엇인가? Exception과 Error의 차이는?

컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러(Error)라고 한다. 에러는 JVM 실행에 문제가 생겼다는 것이므로, 프로그램은 실행 불능이 된다. 개발자는 이런 에러에 대처할 방법이 없다.

자바에서 에러 이외에 예외(Exception)라고 부르는 오류가 있다. 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 오류다. 예외가 발생되면 프로그램이 종료된다는 점에서 에러와 동일하지만, 예외는 예외 처리(Exception Handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태를 유지할 수 있다.

래퍼런스
https://velog.io/@pearl0725/자바에서-예외를-처리하는-방법
https://scshim.tistory.com/238

profile
오늘도 성장중

0개의 댓글