[Java] 자바 예외 처리 - Throw, Throws
자바 예외처리 : Throw, Throws
자바 예외처리에 대해서 알아보기 전에 오류와 예외에 대해서 정리를 해보려고한다.
일단, 오류와 예외는 다르다.
🔍 오류(Error)와 예외(Exception)
오류(Error)는 시스템이 비정상적인 상황이 생겼을 때 발생한다.
예를들어,
메모리 부족(OutofMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 복구할 수 없는 것을 말한다.
이러한 오류는
주로 JVM에서 발생하기 때문에 애플리케이션 코드에서 해결하면 안되고,
개발자가 예측하기도 쉽지 않고 처리할 수 있는 방법도 없다.
예외(Exception)는 프로그램 실행 중 개발자의 실수로 예기치 않는 상황이 발생했을 때 발생한다.
예를들어,
값이 null인 참조변수를 참조(NullPointException)한다던지
존재하지 않는 파일의 이름을 입력(FileNotFoundException)했다던지 .. 등
자신이 개발한 로직에서 예외를 예측하여 그에 따른 예외 처리를 신경써야 한다.
Java에는 크게 보면 두 종류의 예외(Exception)가 있다.
🔍 Checked Exception 과 Unchecked Exception
Checked Exception은 컴파일러가 처리 안하면 경고하는 Exception이고,
Unchecked Exception은 런타임에 당연히 발생할 수 있기때문에 컴파일러가 처리 안해도 봐주는 Excpetion이다.
Checked Exception | Unchecked Exception | |
Runtime Exception 상속 | X | O |
예외 처리 여부 | 필수 O | 필수 X |
확인 시점 | 컴파일 단계 | 런타임 단계 |
예외 발생시 트랜잭션 처리 | Roll-back 이 되지 않고, 트랜잭션이 커밋까지 완료. | Roll-back 됨 |
1) Checked Exception - 체크 예외
Exception 클래스의 하위 클래스들이며
반드시 예외를 잡아서 처리하거나(try ~ catch), 예외를 밖으로 던지는 throw 예외를 선언해서
반드시 에러 처리를 해야한다.
그렇지 않으면 컴파일 오류가 발생한다.
- 종류
- IOException
- SQLException
- ClassNotFoundException
2) Unchecked Exception (RuntimeException) - 언체크 예외
Runtime Exception(런타임 예외)클래스의 하위 클래스이며,
체크 예외와 달리 에러 처리를 강제하지 않는다.
그리고 말 그대로 실행 중(Runtime)에 발생 할 수 있는 예외를 의미한다.
- 종류
- NullPointerException
- ArrayIndexOutOfBoundsException
- IllegalArgumentException
- InvaildFormatException
- NumberFormatException
🔍 Exception 처리
1. try-catch (finally) 구문
try {
// 예외가 생길 가능성이 있는 코드 작성
} catch(예외발생 클래스명 e){
// 예외처리 코드
} finally {
// 예외 발생 여부와 관계없이, 마지막에 수행되어야 하는 코드 작성
// 필수 아님
}
위 코드는 try ~ catch 구문의 구조이다.
try 문에서 Exception 예외가 발생할 경우 catch (Exception e)로 빠지고, 해당 실행문을 실행한다.
finally블럭은 try-catch문과 함께 예외발생 여부과 관계없이 "무조건" 실행되어야할 코드를 적는다.
finally블럭은 필수는 아니며, 마지막에 선택적으로 덧붙여 사용한다.
예외 발생시 try->catch->finally 순으로,
발생 하지 않은 경우 try->finally 순으로 실행된다.
2. throw
throw는 Exception을 발생시킬 때 사용하는 키워드이다.
만약 어떤 연산을 하다가 예상치 못한 일이 발생했을 때,
Exception을 발생시켜 예외가 처리될 수 있도록 한다.
즉, 명확한 의미로 예외로 바로 처리한다.
Application이 예외를 적절히 처리하지 못하면 프로그램이 죽거나 오동작하게 된다.
3. throws
throws는 메소드를 정의할 때 사용하며,
이 메소드에서 발생할 수 있는 Exception을 명시적으로 정의할 때 사용한다.
즉, 자신을 호출한 메소드에게 예외 처리를 위임한다.
따라서 throws를 보면 잠재적으로 어떤 Exception을 발생될 수 있는지 쉽게 알 수 있다.
💻 예제
코드를 보면 둘다 throw를 하고 있는데
위에 코드는 빨간줄이 없고, 밑에 코드는 빨간줄이 있는데
NullPointException은 런타임에서 언제나 발생할 수 있으므로 예외 처리를 안해도 컴파일러가 경고를 안하는데
FileNotFoudnExcpetion은 꼭 예외 처리하라고 경고해주는 것이다.
그럼, 이 경고를 잠재우는 방법이 두가지가 있는데
첫번째 방법은
내가 throws로 내가 여기서 예외처리 안할거고
'나 쓰는 사람이 알아서 하셈' 하고 선언 해주거나
두번째 방법은
내가 직접 try ~ catch로 예외처리해준다.
그럼, 다시 돌아와서
첫번째 방법인 throws 로 선언한 경우에는
useY()메소드에 y() 쓰는 쪽에서 빨간줄이 생겼는데,
y()를 살펴보면 throws로 ‘나 Checked Exception인 FNFE를 던질게 쓰는 쪽에서 처리해’ 라고 선언했는데
useY() 메소드에 y()가 그걸 무시하고있어서 빨간줄이 그였다. (경고 경고)
그럼, 해결 방법으로
1. useY()도 똑같이 throws로 책임전가 하거나
2. try ~ catch로 직접 처리하면 된다.
근데, try ~ catch 해놓고
전혀 다른 엉뚱한 Exception 잡으려고하면 또 경고가 발생한다. (삐용 삐용)
근데 !
x()의 NullPointerException은 Unchecked Exception이기 때문에
useX() 메소드에서 throws를 선언하든 안하든
useX()에서는 경고가 발생하지 않는다 !
근데 !
useX()메소드의 x()가 실제로는 NullPointerException만 던지고 있지만.
만약, ‘나 그냥 Exception 다 던질수 있음’ 하고 선언하면
Exception은 Unchecked Exception이랑 CheckedException을 포괄하고 있어서
useX() 쪽에서 빨간줄이 그어진다.
그럼 useX()도 울며겨자먹기로 throws Exception을 선언하거나
try ~ catch로 다 감싸야 한다.
만약 이렇게 x()는 실제로는 NPE만 발생시키니까 useX()쪽에서 나는 NPE만 처리하고 싶은데...라고 해도
throws의 약속에는 모든 Exception을 다 던질수있다고 되어있어서
useX()도 모든 Exception을 다 처리안하고,
NPE만 처리하면 또 경고를 한다.
그래서 throws + checked exception 조합은 최악이라고 할 수 있다 ..
(throws Exception이 제일 최악이다.)
-> 구체적인 체크 예외로 밖으로 던지는 방식(try ~ catch & throws)을 사용하자
자기를 한번이라도 사용하는 모든 사람이 똑같이
throws checkedException
혹은 try catch checkedException 을 하도록 강제한다.
예제를 알려주며 저에게 도움을 준 스승님 엄씨에게 감사합니다. 😊
- 참고
https://devlog-wjdrbs96.tistory.com/351
[Java] Checked Exception vs Unchecked Exception 정리
체크 예외와 언체크 예외(Checked, Unchecked Exception) 자바의 예외는 크게 3가지로 나눌 수 있습니다. 체크 예외(Checked Exception) 에러(Error) 언체크 예외(Unchecked Exception) 자바에서 에러, 예외 관련된 클래
devlog-wjdrbs96.tistory.com
https://www.baeldung.com/java-checked-unchecked-exceptions
Checked and Unchecked Exceptions in Java | Baeldung
Learn the differences between Java's checked and unchecked exception with some examples
www.baeldung.com
https://codechacha.com/ko/java-throw-and-throws/#google_vignette
Java - throw와 throws의 차이점
throw와 throws 키워드는 비슷하지만 다른 용도로 사용됩니다. throw는 Exception을 발생시킬 때 사용하는 키워드입니다. 만약 어떤 연산을 하다가 예상치 못한 일이 발생했을 때 Exception을 발생시켜 예
codechacha.com