
[Java] 예외란 뭘까
zl존석동
·2022. 1. 10. 17:55
자바 Exception 에 대하여 간단하게 알아보자!
Error vs Exception
Unchecked vs Checked
Error vs Exception
Error
프로그램에서 발생하는 비정상적인 상황을 말한다
시스템 레벨에서 발생되는 심각한 상황으로 개발자가 예측하여 핸들링 할 수 없다.
StackOverflowError , OutOfMemoryError 등.. 의 에러는 발생하면 복구 할 수 없다!
Exception
예외는 프로그램 레벨에서 발생할 수 있는 프로그램의 정상적인 동작을 방해할 수 있는 상황을 말한다.
사용자에 의해 발생할 수 있는 유사상황으로 미리 예상하여 '처리' 할 수 있다!
예외가 발생하게 되면 발생한 시점의 정보를 포함한 예외객체가 런타임 시스템으로 전해져 알 수 있게 된다
예외와 에러는 모두 최상위의 Object를 상속받는 Throwable 을 상속받는 클래스이다.
Unchecked vs Checked
Checked Exception
말 그대로 바로 체크가 되는, 반드시 처리해야 하는 예외를 말한다.
컴파일 시점에 예외를 캐치해서 처리하고 있는지 검사되기 때문에 예외처리가 강제된다.
throws 로 짬? 때리던지 try catch 로 거기서 처리하던지 해야만 한다.
대표적으로 IOException 이나 SQLException 같은 것들이 있다.
백준 문제 풀 때 몇번 사용했던 BufferedReader ..
항상 메인 메소드에 throws 로 IOException 을 떠넘겼었다.
아마 문제를 채점할 때 백준쪽에서 우리가만든 main 메소드를 실행할거고
거기서 try/catch로 받아와 예외처리를 하지 않을까?? 라고 이해했다!
Unchecked Exception
컴파일 시점 에 예외를 확인하지 않고 런타임 시점에 알 수 있는 (RuntimeException) 예외를 말한다.
컴파일 시점에 체크를 하지 않기 때문에 런타임 예외가 발생할 수 있다고 하더라도 빨간줄 이 안 뜬다.
즉. 명시적인 예외처리가 필수가 아닌 예외이며 프로그래머의 실수에 의해 발생될 수 있는 예외라고 할 수 있다.
ArrayIndexOutOfBoundsException 나 NullPointerException 이 대표적이다.
명백하게 개발자의 실수로 인해 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 Exception 인 SQLException 이 발생할 수 있는 코드가 있다면
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 exception 을 unchecked 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 |