JAVA(SPRINGBOOT)

[JAVA] EXCEPTION(예외처리)

본듀 2022. 12. 16. 11:15

예외처리의 필요성

오류를 감지하는 과정과 처리하는 과정을 분리함으로써 오류를 감지하고 처리하지 않을 경우를 없앤다.

 

예외 던지기

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