1. @SneakyThrow 란?
Lombok에서 제공하는 어노테이션으로 메서드 선언부에 예외 처리문(throws, try-catch문)을 따로 정의하지 않고, 예외 처리를 할 수 있게 해준다.
1-1. @SneakyThrow 의 특징
1. 예외 클래스를 파라미터로 입력해 원하는 예외 클래스만 동작하도록 할 수 있다.
@SneakyThrows(UnsupportedEncodingException.class)
public void utf8ToString(byte[] bytes) {
return new String(bytes, "UTF-8");
}
@SneakyThrows
public static void IoException() {
throw new IoException("hello world");
}
2. JVM(클래스 파일) 수준에 확인 여부에 관계 없이 모든 예외에 대한 throw가 동작한다.
💡@SneakyThrow를 사용하면 불필요하게 코드를 작성하지 않아도 될 것 같지만 @SneakyThrow은 논란의 여지가 있으므로 사용에 신중해야 한다고 공식 문서에 표기되어 있다.
2. 사용하는 이유
Lombok 공식 홈페이지에는 해당 어노테이션을 유용하게 사용하는 특별한 경우 2가지를 표기하였다.
2-1. Runnable 인터페이스
Runnable의 run() 메서드 안에서 발생한 예외는 호출한 스레드로 제대로 전파되지 않는다. 모든 예외가 RuntimeException으로 묶여 던져지기 때문에 정상적인 예외를 처리할 수 없는데, 그런 경우에 유용하게 사용된다.
import lombok.SneakyThrows;
public class SneakyThrowsExample implements Runnable {
@SneakyThrows(UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
return new String(bytes, "UTF-8");
}
@SneakyThrows
public void run() {
throw new Throwable();
}
}
2-2. 발생할 수 없는 예외
@SneakyThrows(UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
return new String(bytes, "UTF-8");
}
new String(bytes, "UTF-8") 은 지원되지 않는 인코딩 타입에 대한 예외인 UnsupportedEncodingException이 던져질 수 있다고 선언되어 있다. 하지만 JVM 스펙에서는 UTF-8이 항상 사용 가능해야 하기 때문에 이 예외는 발생할 수 없는 예외이다.
💡 @SneakyThrow를 사용한 메서드에서 예외가 발생하면 catch문에서 e.printStackTrace(); 메서드를 호출한 것과 같은 예외가 출력된다.
3. @SneakyThrow의 문제점
선언되지 않은 Checked Exception을 잡을 수 없다.
@SneakyThrow를 사용한 메서드를 호출하면서 try-catch문에 해당 Exception을 catch하고자 하였을 때 컴파일러에서 IOException이 try 블록에서 절대 발생하지 않는다며 코드 변경을 요구했다.
💡 test() 메서드는 IOException을 발생시켰지만 컴파일러는 이를 인식하지 못하고 있으며, 컴파일 또한 실패한다는 것이다. 해당 문제는 catch문에 IOException을 Exception으로 변경하면 해결된다.
Reference.
http://www.javabyexamples.com/lombok-sneakythrows
https://partnerjun.tistory.com/55
'Backend > Java & Kotlin' 카테고리의 다른 글
[JVM]가비지 컬렉션(Garbage Collection, GC)의 개념 (0) | 2023.09.01 |
---|---|
[JVM] 동작 방식 및 메모리 구조(2) (0) | 2023.08.31 |
[JVM] 동작 방식 및 메모리 구조(1) (0) | 2023.08.30 |
JVM이란? (0) | 2023.08.29 |
[Java] Record란? (0) | 2023.08.09 |