[Java] 예외란 뭘까

zl존석동

·

2022. 1. 10. 17:55

 

자바 Exception 에 대하여 간단하게 알아보자!


 

Error vs Exception

Unchecked vs Checked

 

 

 

 

 

Error vs Exception

 

 

 

 

Error

 

 

프로그램에서 발생하는 비정상적인 상황을 말한다

 

시스템 레벨에서 발생되는 심각한 상황으로 개발자가 예측하여 핸들링 할 수 없다.

 

StackOverflowError , OutOfMemoryError 등.. 의 에러는 발생하면 복구 할 수 없다!

 

 

 

Exception

 

 

예외는 프로그램 레벨에서 발생할 수 있는 프로그램의 정상적인 동작을 방해할 수 있는 상황을 말한다.

 

사용자에 의해 발생할 수 있는 유사상황으로 미리 예상하여 '처리' 할 수 있다!

 

예외가 발생하게 되면 발생한 시점의 정보를 포함한 예외객체가 런타임 시스템으로 전해져 알 수 있게 된다

 

 

예외에러는 모두 최상위의 Object를 상속받는 Throwable 을 상속받는 클래스이다.

 

 

 java의 정석

 

 

 

 

 

 

 

Unchecked vs Checked

java의 정석

Checked Exception

 

 

말 그대로 바로 체크가 되는,  반드시 처리해야 하는 예외를 말한다.

 

컴파일 시점에 예외를 캐치해서 처리하고 있는지 검사되기 때문에 예외처리가 강제된다.

 

throws 로 짬? 때리던지 try catch 로 거기서 처리하던지 해야만 한다.

 

대표적으로 IOException 이나 SQLException 같은 것들이 있다.

 

 

throws로 호출하는 쪽에서 처리하게 떠넘기던지 try/catch로 처리하던지 선택해야 한다

 

 

 

 

백준 문제 풀 때 몇번 사용했던 BufferedReader ..

 

항상 메인 메소드에 throwsIOException 을 떠넘겼었다.

 

아마 문제를 채점할 때 백준쪽에서 우리가만든 main 메소드를 실행할거고

 

거기서 try/catch로 받아와 예외처리를 하지 않을까?? 라고 이해했다!

 

 

 

 

Unchecked Exception

 

 

컴파일 시점 에 예외를 확인하지 않고 런타임 시점에 알 수 있는 (RuntimeException) 예외를 말한다.

 

컴파일 시점에 체크를 하지 않기 때문에 런타임 예외가 발생할 수 있다고 하더라도 빨간줄 이 안 뜬다.

 

즉. 명시적인 예외처리가 필수가 아닌 예외이며 프로그래머의 실수에 의해 발생될 수 있는 예외라고 할 수 있다.

 

ArrayIndexOutOfBoundsExceptionNullPointerException 이 대표적이다.

 

 

 

 

명백하게 개발자의 실수로 인해 NullPointerException 예외가 발생되는 모습이다.

 

개발자는 PDS의 girlfriend 목록이 null 이 될 수도 있어

 

get() 이 예외를 뱉는다는 것을 예상하고 어떤 처리를 했어야만 했다.

 

이런식으로 발생할 예외를 처리하지 못하면 프로그램은 비정상적으로 종료되며

 

처리되지 못한 예외 (uncaught exception)JVM 예외처리기가 받아 예외의 원인을 출력해주게 된다.

 

 

 

 

 

결국 예외처리란?

 

 

프로그램 실행 시 발생될 수 있는 유사상황에 대비하는 코드를 작성해 프로그램의 비정상적인 종료를 막고 
의도대로 흘러갈 수 있게 해주는 것을 말한다.

 

 

 

 

 

 

 

 

예외처리 방법

 

 

 

1. 직접 처리

 

try / cach / finally 블록으로 직접 처리한다.

 

 

try 

 

- 예외가 발생할 수 있는 코드 작성

 

 

 

catch

 

- try 에서 발생한 해당되는 예외에 대해 처리하는 코드를 작성한다.

- Exception 또는 Throwable로 모든 예외를 처리할 수 있지만 발생할 수 있는 예외에 대해 상세하게 처리할 것

- 여러 catch 블록을 작성해야할 경우 자손부터 만들기

- 예외를 무시하지마라! : catch 내부를 절대 비우지 말 것! 비운다면 왜 비우는지 주석이라도 달기

 

 

finally

 

- 예외가 발생되는 것과 상관없이 반드시 실행시켜야 하는 코드를 작성한다.

 

 

 

 

 

2. Throws

 

 

throws 키워드를 사용해 해당 메소드를 호출하는 부분으로 예외를 넘길 수 있다.

 

void run() throws SQLException {
//..
}

 

해당 메소드에 Checked ExceptionSQLException 이 발생할 수 있는 코드가 있다면

 

throws 키워드를 통해 앞으로 해당 예외가 처리될 것으로 인식시킬 수 있다.

 

메소드 선언부에 선언된 throws 키워드는 해당되는 종류의 예외가 발생할 가능성이 있다는 것을 말해주는 것이기도 하다.

 

메소드를 사용하는 쪽에서 이 예외에 대한 처리를 강요받아 프로그램이 견고해질 수 있다.

 

 

public class UncheckedExceptionExam {
    public static void main(String[] args) {
        PDS pds = new PDS();
        try {
        	// compile exception이 붙은 메소드 호출은 예외처리를 강요받음
            pds.run();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        
        // 당연히 runtime exception 은 예외처리를 강요받지 않음
        pds.run2();
    }
}

class PDS {
    void run() throws SQLException {
        if(1 == 1) {
            throw new SQLException();
        }
    }
    void run2() {
        if (1 == 1) {
            throw new NullPointerException();
        }
    }
}

 

 

 

 

 

3.  예외 전환하기

 

 

void run() {
    try {
    	// code
    }
    catch(SQLException e) {
	    throw new CustomException("커스텀 에러");
    }
}



class CustomException extends RuntimeException {

    public CustomException(String msg) {
        super(msg);
    }
}

 

예외를 잡아 다른 예외를 다시 던진다.

 

적절히 변경되서 다시 던져지는 예외를 통해서 어떤 예외인지 정확하게 인식하고 더 수월하게 처리해줄 수 있고

 

 

 

 

 

예외 연결하기

 

 

    void run() {
        if (1 == 1) {
            CustomException customException = new CustomException("커스텀예외");
            customException.initCause(new SQLException());
            throw  customException;
        }
    }

 

 

 

 

위 코드의 경우 SQLException 이 원인 예외가 되어 CustemException을 던지는 형태가 된다.

 

 

  Throwable initCause(Throwable cause)
 - 지정 예외를 원인 예외로 등록 메소드
  Throwable getCause()
 - 원인 예외 반환 메소드

 

 

원인을 제공하는, 반환되는 예외들에 대해 디버깅에 유용해질 수 있어 오류 찾기에 편해지고

 

프로그램적인 오류에 대해 checked exceptionunchecked exception 으로 감싸서 처리해주어 

 

강압적인 try-catch 문 사용을 방지할 수 있다.

 

 

 

 

 

 

 

 

 

ref

 

 

 

 

자바(Java)에서 예외(Exception)란 무엇인가?

1. 예외란 무엇인가? 예외란 프로그램 실행 중 발생하는 이벤트로 프로그램 명령의 정상적인 흐름을 방해하는 것이다. 예외가 발생하게 될 경우 예외객체를 만들어 런타임 시스템에 전달한다.

mungto.tistory.com

 

Java 예외(Exception) 처리에 대한 작은 생각

일상생활에서도 기본적인 것은 고민하지 않고 습관처럼 사용하는 경우가 있다. 초급 개발자인 나에게 ‘예외(Exception)’이 바로 그런 것이었다. 처음 JAVA수업 때 강사님께 "왜 로직을 try문으로

www.nextree.co.kr

 

Java의 정석 기초편

교육현장에서 뒤쳐지는 학생들을 위해 쓰고, 학생들에게 직접 검증받고 호평받은 책. 코딩을 처음 배우는 사람도 자바를 쉽게 배울수 있게 도와준다.

book.naver.com

 

이펙티브 자바

JAVA, 더 깔끔하고, 정확하고, 안전하며, 재사용이 쉬운 코드로 만들자!『EFFECTIVE JAVA(이펙티브 자바)』는 효율적이면서도 잘 설계된 자바 프로그램을 구현하기 위해 알아야 할 지침 78가지를 소개

book.naver.com

 

'Java' 카테고리의 다른 글

[Java] ConcurrentModificationException 해결하기  (0) 2022.02.04
[Java] 올바른 Map Iteration  (0) 2022.01.23
[Java] Abstract , Interface  (0) 2022.01.09
[Java] 람다식이란  (0) 2022.01.06
[Java] 중첩 클래스  (0) 2022.01.05