Java

Java 예외 처리 (Exception, try catch)

blackbearwow 2024. 9. 21. 15:52

프로그래밍 오류의 종류는 논리적 에러 (Logical Error), 컴파일 에러 (Compillation Error), 런타임 에러 (Runtime Error)가 있다.

 

논리적 에러 (Logical Error): 실행은 되지만 의도와 다르게 동작하는 것

컴파일 에러 (Compillation Error): 컴파일시에 발생하는 에러

런타임 에러 (Runtime Error): 실행중에 발생하는 에러

 

Java에서는 런타임 에러는 에러(error)와 예외(exception) 두가지로 구분한다.

에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 에러

예외(exception): 프로그램 코드에 의해서 수습될 수 있는 미약한 에러

 

에러(error)는 JVM에 문제가 생긴 것으로 개발자가 대처할 방법이 없다. 

예외(exception)은 개발자가 대처할 수 있는 에러이다. try catch문으로 예외처리 할 수 있다.

 

Exception 클래스의 자식을 보면 RuntimeException과 그 외의 에러가 있다.

RuntimeException의 자식은 예외처리 하지 않아도 컴파일이 되지만, 그 외 exception들은 예외처리하지 않으면 컴파일이 되지 않는다. 

 

Checked Exception: 꼭 예외처리해야하는 예외. 예외처리 하지 않으면 컴파일되지 않는다

Unchecked Exception: 예외처리하지 않아도 되는 예외.

Error와 RuntimeException은 Unchecked Exception이고, 그 외 Exception은 Checked Exception이다.

 

코드를 짜다 보면 별것 아닌 예외도 checked exception으로 등록 된 것이 꽤 많은데, 이유는 자바 언어를 처음 개발 했을 때 프로그래밍 경험이 적을 사람도 보다 견고하게 프로그램을 작성할 수 있도록 유도하기 위해서이다.

 

문법

try {
	//예외발생할 가능성이 있는 명령어
}
catch (예외클래스 e) {
	//예외처리
}
finally {
	//예외가 발생하던 아니던 마지막에 실행될 명령어
}

try{}catch(예외클래스 e){}finally{}로 구성되며, finally는 선택사항이다.

 

대표적인 예외 클래스이다.

예외클래스 설명
Exception 예외 클래스들의 부모 클래스
ArithmeticException 어떤 수를 0으로 나누는 것과 같이 비정상 계산중 발생
NullPointerException NULL 객체 참조시 발생
IllegalArgumentException 메소드의 전달 인자값이 잘못될 경우 발생
IllegalStateException 객체의 상태가 메소드 호출에는 부적합할 경우 발생
IndexOutOfBoundsException index값이 범위를 넘어갈 경우 발생
InputMismatchException 의도치 않는 입력 오류시 발생
UnsupportedOperationException 객체가 메소드를 지원하지 않는 경우 발생
SecurityException 보안 위반 발생 시 보안 관리 프로그램에서 발생
ProviderException 구성 공급자 오류시 발생
NoSuchElementException 구성요소가 그 이상 없는 경우 발생
ArrayStoreException 객체 배열에 잘못된 객체 유형 저장시 발생
ArrayIndexOutOfBoundsException 배열의 범위를 넘어선 인덱스를 참조할 때 발생
ClassCastException 클래스 간의 형 변환 오류시 발생
EmptyStackException 스택이 비어있는데 요소를 제거하려고 할시 발생

 

예시

import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(true) {
            try {
                int i = sc.nextInt();
                System.out.println(100/i);
            }
            catch(InputMismatchException e) {
                System.out.println("정수를 입력해주세요");
                sc.next();
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

콘솔로부터 정수를 읽어 100을 나눈 값을 출력하는 프로그램이다.

정수가 아닌 값을 입력하면 InputMismatchException가 발생하여 첫번째 catch문이 실행될 것이다.

0을 입력하는 등 InputMismatchException가 아닌 예외가 발생하면 두번째 catch문이 실행될 것이다.

 

예외 발생시키기

throw키워드를 사용해 에러를 발생시킬 수 있다. 

 

예시

public class Main {
  static void checkAge(int age) {
    if (age < 18) {
      throw new ArithmeticException("Access denied - You must be at least 18 years old.");
    }
    else {
      System.out.println("Access granted - You are old enough!");
    }
  }

  public static void main(String[] args) {
    checkAge(15); // Set age to 15 (which is below 18...)
  }
}

 


참고: https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%90%EB%9F%ACError-%EC%99%80-%EC%98%88%EC%99%B8-%ED%81%B4%EB%9E%98%EC%8A%A4Exception-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%ACException-%EB%AC%B8%EB%B2%95-%EC%9D%91%EC%9A%A9-%EC%A0%95%EB%A6%AC

https://www.w3schools.com/java/java_try_catch.asp

-