예외처리의 필요성
오류를 감지하는 과정과 처리하는 과정을 분리함으로써 오류를 감지하고 처리하지 않을 경우를 없앤다.
예외 던지기
public String example(int a, int b) {
int c = a - b;
return "a가 b보다 " + c + "만큼 더 큽니다.";
}
만약 example(1,2)를 호출한다면 올바른 결괏값을 얻을 수 없다.
따라서 예외 처리를 해주어야 한다.
if (a < b)
throw new IllegalArgumentException("check that a > b" );
다음과 같이 throw를 통해 IllegalArgumentException 객체를 던질 수 있다.
throw문이 실행되면 정상적인 실행 흐름은 즉시 중단된다.
검사 예외와 비검사 예외
검사 예외 : 개발자가 명시해야하는 부분
어플리케이션 수행 중 일어날 법한 예외를 검사하고 대비하는 목적
과도한 예외 검출은 시스템의 성능 저하
비검사 예외 : 시스템적인 예외
RuntimeException, Error
두 예외는 발생하더라도 대응할 조치가 없는 경우가 많아 예외 처리를 할 의무는 없음
예외 잡기 (try-catch)
try {
''';
} catch(ExceptionClass e) {
''';
}
try 블록 내의 코드를 실행하다 지정한 예외가 일어나면 catch 블록으로 제어가 넘어간다.
try-with-resources 문
PrintWriter out = new PrintWriter("output.txt");
for (String line : lines) {
out.println(line);
}
out.close();
위 코드에서 close 메서드가 호출되기 전 예외를 던지면 close가 호출되지 않는다.
출력을 유실하거나, 예외가 여러 번 일어나면 파일 핸들을 소진할 수 있다.
그래서 try블록 선언부에 리소스를 지정해서 이런 문제를 해결한다.
try (PrintWriter out = new PrintWriter("output.txt") {
''';
}
위와 같은 경우 try 블록을 빠져나올 때 객체의 close메서드가 호출된다.
그러기 위해서 리소스들은 AutoCloseable 인터페이스를 구현하는 클래스에 속해야한다.
finally 절
try-with-resources문은 예외 발생과 상관없이 AutoCloseable 처리를 했다.
그 외의 처리해야할 것들은 finally절을 사용해 처리한다.
try {
''';
} finally {
''';
}
finally절은 예외 발생과 상관없이 try 블록이 끝날 때 실행된다.
finally절에서 예외를 던지면 try블록의 예외가 가려질 수 있기 때문에 finally절에서는 예외를 던지는 일이 없어야한다.
또한, finally절에 return문을 쓰면 try블록의 return문이 결국 finally절에서 교체되기 때문에 사용하지 않는다.
'JAVA(SPRINGBOOT)' 카테고리의 다른 글
[JAVA] 비교연산자 (==, equals) (0) | 2022.12.16 |
---|---|
[JAVA] REQULAR EXPRESSION(정규 표현식) (0) | 2022.12.16 |
[JAVA] STREAM(스트림) (0) | 2022.12.16 |
[JAVA] INTERFACE(인터페이스) (0) | 2022.12.06 |
[JAVA] Hashmap (0) | 2022.11.01 |