JAVA(예외 처리)

김민성·2023년 7월 7일

JAVA

목록 보기
9/11
post-thumbnail

예외 / 예외 클래스

  1. 예외 상황 발생
  2. 에러와 관련된 정보를 가지고 있는 Exception 객체가 생성됨
  3. Exception 객체가 소멸되지 않으면 프로그램은 비정상적 종료

예외 클래스 분류

Checked Exception
: 컴파일 시에 예외 처리를 해 주었는지 체크하는 Exception
-> IOException

Unchecked Exception ( Runtime Exception )
: 프로그램 실행 중에 발생하는 Exception

  • 컴파일러가 체크하지 않기 때문에 개발자가 예외처리 해 주어야 함

    ArithmaticException : 0으로 나누었을 때
    NumberFormatException : 숫자로 변경될 수 없는 문자열을 숫자로 변경하려고 시도
    NullPointerException : 참조 데이터형 변수의 값이 null인데 객체에 접근하려고 하는 경우
    ArrayIndexOutOfBoundsException : 배열의 범위를 벗어난 인덱스 접근
    ClassCastException : 객체의 형 변환 시, 잘못된 클래스로 변환할 때

예외 처리 코드

try{
	// Exception이 발생할 수 있는 구문
} catch ( Exception_클래스_타입 변수명 ) {
	// Exception이 발생했을 경우 수행해야 하는 구문
}

try

  • Exception이 발생할 가능성이 있는 코드를 try 블록으로 감싼다.
  • try 블록 안에 있는 문장들은 Exception이 발생하지 않는 한, 모두 정상 수행
  • Exception이 발생되면, 즉시 Exception 객체를 catch 블록으로 전달

catch

  • Exception 객체를 받아서 예외 상황이 발생했을 때 수행할 일들 작성
  • 여러 Exception 클래스 타입들 중 가능성이 있는 클래스 객체를 선언
  • try 안에서 여러 Exception이 발생 가능성이 있을 경우 여러 catch 블록
    -> 하위 클래스의 Exception 부터 작성

finally

  • try 블록 안 코드의 Exception 발생 유무와 상관없이 반드시 수행
  • catch 블록이 모두 끝난 후 finally 블록을 작성
  • try 문과 catch 문에서 return 을 사용하더라도 finally문은 실행됨

예외 떠넘기기

: 메소드 내부에서 예외 발생 시 try-catch 블록으로 처리하는 것이 기본이지만, 메소드를 호출한 곳으로 예외를 떠넘길 수 있음

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

throws 키워드가 붙은 메소드에서 해당 예외를 처리하지 않고 떠넘겼기 때문에 이 메소드를 호출하는 곳에서 예외를 받아 처리해야 함

  • 나열해야 할 예외클래스 수가 많은 경우 단순히 'throws Exception' / 'throws Throwable'로 모든 예외를 넘길 수 있음
  • main() 메소드에서도 throws로 예외를 넘길 수 있는데, 이 경우 JVM이 최종적으로 예외 처리를 함

사용자 정의 예외

: 일반 예외로 선언할 수도 있고, 실행 예외로 선언할 수도 있음
-> Exception의 자식 / RuntimeException의 자식 클래스로 선언

public class UserDefineException extends [Exception|RuntimeException]{
	// 기본 생성자
	public UserDefineException() {
    }
    // 예외 메세지를 입력받는 생성자
    public UserDefineException(String message) {
    	super(message);
   }
  • 기본 생성자와 예외 메세지를 입력받는 생성자를 선언
  • 예외 메세지는 부모 생성자 매개값으로 넘겨줌
    -> 예외 객체의 공통 메소드인 getMessage()의 리턴값으로 사용하기 위해

예외 발생시키기

: throw 키워드와 함께 예외 객체를 제공하면 됨

  • try - catch 로 처리
void method() {
	try {
    	throw new Exception("예외메세지");}
    catch (Exception e) {
    	String message = e.getMessage();}
}
  • 메소드를 호출한 곳에서 처리(대부분 이렇게 처리)
void method() throws Exception {
	...
	throw new Exception("예외메세지");
    ...
}

메소드 선언부에서는 throws : 예외 떠넘기기
코드 내부에는 throw : 예외 발생시키기

0개의 댓글