본문 바로가기
공부 일지/프로그래밍 언어

[JAVA] 예외 처리

by Joshbla 2023. 3. 29.

JAVA 예외 처리

Error와 Exception의 차이는 무엇일까? 평소 별 생각이 없었고 같은 의미로 생각하고 사용하고 있었다.

그러나 JAVA에서는 둘을 구분하고 있다.

 

Error는 개발과정에서 무엇인가 잘못하여 발생하는 것이아닌 애플리케이션이 동작하는 환경에서 어떤 문제가 생겨 생기는 것을 Error라고 한다. (메모리 부족의 문제, 운영체제 상의 문제 등...)

Exception은 개발자가 작성한 코드가 의도한 결과와 다른 결과를 발생시킨 경우를 Exception이라고 한다.

(파일을 읽으라는 명령을 내렸지만 파일이 없는 경우, 입력에 따른 결과값이 예상과 다른 경우 등 ..)

 

예외 처리


Exception (예외)란

 

아래와 같은 코드가 있다.

public static void main(String[] args) {
    int a = 2;  //사용자 입력값
    int sum = 0;
    System.out.println(sum += 1);
    System.out.println(sum += 2);
    System.out.println(sum += (3 / a));
    System.out.println(sum += 4);
    System.out.println(sum += 5);
}

이 때 사용자가 0을 입력하면 어떻게 될까?

어떤 수를 0으로 나누는 것은 수학적으로 불가능 하므로 예외를 발생시키고 프로그램을 멈춘다.

프로그램을 멈춘다는 부분이 중요한데 예외가 발생했을 때 그대로 진행한다면

훗날 어디에서 예외가 발생했는지 알 수 도 없고 그 예외로 인한 문제가 더 커질 수 있다.

따라서 프로그램을 아예 종료시킨다.


예외 처리 법

이렇게 예외가 발생했을 때 처리하는 법을 알아보자

...

int a = 0;
System.out.println(sum += 1);
System.out.println(sum += 2);
try {
    System.out.println(sum += (3 / a));
} catch (ArithmeticException e) {
    System.out.println("잘못된 계산입니다");
}

...

/** 
출력: 
1
3
잘못된 계산입니다
**/

try-catch문을 활용하여 예외를 처리할 수 있다.

 

ArithmeticException말고 다른 예외도 처리해보자

public static void main(String[] args) {
    int[] scores = new int[]{1, 2, 3};
    try {
        System.out.println(1);
        System.out.println(2);
        System.out.println(scores[3]);
        System.out.println(3);
        System.out.println(4 / 0);
    } catch (ArithmeticException ae) {
        System.out.println("잘못된 계산입니다");
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("없는 값입니다");
    }
    System.out.println(5);
}

/**
출력: 
1
2
없는 값입니다
5
**/

위와 같이 만들어주면 순서대로 1과 2를 출력하고

그 다음 scores[3]을 출력하는 과정에서 ArrayIndexOutOfBoundsException가 발생하면서

그 후의 try 내부의 작업들은 모두 멈추게 된다.(3과 4/0을 출력하는 부분)

-> 아예 실행하지 않았기 때문에 ArithmeticException도 발생하지 않는다.

그 후 try문 밖에있는 5를 출력하는 명령이 실행된다.


예외 클래스

자바의 예외클래스는 아래와 같은 상속도를 가진다.

예외는 런타임 예외(Runtime Exception)과 일반 예외(Exception)로 나뉘어 진다.

 

런타임 예외는 컴파일러가 코드를 검사하지 않는다고 하여 'unchecked 예외', 런타임 에러라고 부르기도 한다.

특정 코드가 실행될 때 발생하는 예외처리를 작성할 때 사용된다.

위에서 사용했던 ArrayIndexOutOfBoundsExceptionNullPointerException등이 런타임 예외에 해당한다.

 

일반 예외는 컴파일러가 코드 실행 전에 코드를 검사하여 'checked 예외', 컴파일 에러라고 부르기도 한다.

컴파일시에 미리 예측가능한 예외처리를 작성할 때 사용된다.

Exception 클래스 중에서 RuntimeException을 제외한 예외를 모두 일반예외라고 한다.

ClassNotFoundException과 같이 실행보지않아도 이미 예외가 발생할 것이 예측되는 경우가 일반예외에 해당한다.

 

 

 

[참조 : https://opentutorials.org/module/4874]

 

Java 예외

수업소개 예상하지 못한 상황을 예외라고 합니다. 예외가 발생했을 때를 대비하는 방법에 대해서 다루는 수업입니다.  수업대상 보다 튼튼한 프로그램을 만들고 싶은 분 에러가 발생했을 때 어

opentutorials.org

 

'공부 일지 > 프로그래밍 언어' 카테고리의 다른 글

[PHP] PHP 첫걸음  (0) 2023.06.01
Querydsl 알아보기  (0) 2023.04.11
Spring AOP  (0) 2023.03.23
[JAVA] 가비지 컬렉션(Garbage Collection)  (3) 2023.03.17
[JAVA] 스트림(Stream)  (0) 2023.01.15