2종류의 Exception
Unchecked Exception – RuntimeException을 상속
- Runtime Time Exception 이라고도 부른다.
- Exception이 발생하는 메소드에서 throws 키워드를 추가하거나, try-catch로 Exception을 처리할 필요가 없다.
- Exception을 처리해 줘도 상관은 없다.
- 컴파일 시점에 Exception을 catch하는지 확인하지 않는다. 컴파일 시점에 Exception이 발생할 것인지의 여부를 판단할 수 없다.
Checked Exception과 Unchecked Exception 선택 방법
- 호출하는 메소드가 Exception을 활용해 무엇인가 의미 있는 작업을 할 수 있다면 Checked Exception을 사용하라.
- 만약 호출하는 메소드가 Exception을 catch해 예외 상황을 해결하거나 문제를 해결할 수 없다면 Unchecked Exception을 사용하라.
- 확실하지 않다면 일단 Unchecked Exception을 사용하자!
(추가로, Error 는 애플리케이션이 정상적으로 동작하는데 심각한 문제가 있는 경우를 의미한다, 개발자가 코드로 해결할수가 없다)
추가적으로 Exception은 다음과 같이 여러 Exception을 던지는 메서드 라는것을 명시할 수 있다.
public void build() throws ObjectStreamException, UnknownHostException {
}
Exception들은 쉼표로 구분하여 추가해주면 된다.
이를 catch하는 부분은 다음과 같다.
public class ExceptionTest {
public void exceptionText() {
try {
new MyTest().build()
} catch (ObjectStreamException e) {
// ObjectStreamException 예외를 처리하는 부분
} catch (UnknownHostException e) {
// UnknownHostException 예외를 처리하는 부분
}
}
}
만약 각 Exception을 각각 처리하고 싶은 것 이 아니라면, 다음과 같이 | 연산자를 사용하여 catch 할 수 있다.
public class ExceptionTest {
public void exceptionText() {
try {
new MyTest().build()
} catch (ObjectStreamException | UnknownHostException e) {
// 예외를 처리하는 부분
}
}
}
만약 catch 부분에서 Exception의 메시지 만을 보여 준 후, 다시 예외를 build 메서드를 호출한 Client 에게 전달하고 싶다면 다음과 같이 예외를 재전달(rethrow) 하면 된다.
public class ExceptionTest {
public void exceptionText() {
try {
new MyTest().build()
} catch (ObjectStreamException | UnknownHostException e) {
// 예외를 출력하는 부분
throw e;
}
}
}
예외가 발생할 경우 예외가 발생한 원인을 찾기 위해 예외의 발생 경로를 추적하는 것이 가능하다.
보통 printStackTrace를 호출하면 된다.
public class ExceptionTest {
public void exceptionText() {
try {
new MyTest().build()
} catch (ObjectStreamException | UnknownHostException e) {
e.printStackTrace()
}
}
}
finally 키워드를 통해서 예외가 발생하더라도 반드시 실행해야 하는 작업을 처리할 수 있다.
try {
// Exception이 발생하는 코드
} catch (Exception e) {
// Exception이 발생하는 경우에 대한 처리
} finally {
// 무조건 실행되는 부분
}
'BackEnd > Java' 카테고리의 다른 글
[Java] equals, hashCode 를 같이 구현하는 이유 (0) | 2022.05.08 |
---|---|
[Java] Java 에서의 Thread, Light Weight Process (0) | 2022.03.30 |
[Java] StringBuilder와 StringBuffer의 차이 (0) | 2022.02.14 |
[Java] 람다와 익명클래스의 scope (0) | 2022.01.23 |
[Java] 자바 함수형 프로그래밍 (0) | 2022.01.21 |
댓글