개발/Java&Kotlin

[Java] 예외처리

devhooney 2022. 8. 23. 13:30
728x90

자바의 정석 챕터 8을 읽고 정리

 

개발하다가 '내가 예외처리를 제대로 하고 있는게 맞을까?' 생각이 들어서 책을 보게 됐다.(기초부터 다시 공부하기 위해)

 

1. 프로그램 오류

- 컴파일 에러: 컴파일 시 발생하는 에러

- 런타임 에러: 실행 시 발생하는 에러

- 논리적 에러: 실행은 되지만, 의도와 다르게 동작하는 것

- 에러: 코드에 의해서 수습될 수 없는 심각한 오류

- 예외: 코드에 의해서 수습될 수 있는 다소 미약한 오류

 

2. 예외 클래스의 계층구조

- 모든 예외의 최고 조상인 Exception 클래스

 

3. 예외처리하기 - try-catch

- 예외처리의 정의: 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것

- 예외처리의 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

try {
    // 예외가 발생할 가능성이 있는 코드
} catch(Exception e1) {
	...
} catch(Exception e2) {
	...
}

- 에러변수는 같으면 안된다.

 

4. try-catch의 흐름

- try 블럭 안에서 예외가 발생한 경우

(1) 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.

(2) 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 코드를 실행하고, 전체 try-catch문을 빠져나가서 그 다음 코드를 실행한다. 만약, 일치하는 catach 블럭을 찾지 못하면, 예외 처리되지 못한다.

 

- try 블럭 안에서 예외가 발생하지 않은 경우

catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 코드를 진행한다.

 

5. 예외의 발생과 catch 블럭

printStackTrace()와 getMessage()

- 예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨 있다.

- printStackTrace(): 예외발생 당시의 호출스택에 있었던 메소드의 정보와 예외 메시지를 화면에 출력한다.

- getMessage(): 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

 

6. 예외 발생시키기

- 연산자 new를 이용해서 발생시키려는 예외클래스의 객체를 만든다.

Exception e = new Exception("Error");

 

- 키워드 throw를 이용해서 예외를 발생시킨다.

throw e;

 

- 한 줄에 예외 발생시키기

throw new Exception("error");

 

7. 메소드에 예외 선언하기

void methd() throws Exception1, Exception2, ... {
    // 메소드 내용...
}

 

8. finally 블럭

- 예외의 발생여부에 상관없이 실행되어야할 코드를 작성

try {

} catch (Exception e) {

} finally {
	// 코드 작성...
}

 

9. 자동 자원 반환 - try-with-resources

try {
    fis = new FileInputStream("score.dat");
    dis = new DataInputStream(fis);
} catch (IOException ie) {
	ie.printStackTrace();
} finally {
	dis.close(); // 예외 발생하더라도 dis를 닫기 위해 finally블럭 사용
}

// 예외문 추가
try {
    fis = new FileInputStream("score.dat");
    dis = new DataInputStream(fis);
} catch (IOException ie) {
	ie.printStackTrace();
} finally {
	try {
    	if (dis != null) dis.close();
    } catch (IOException ie) {
    	ie.printStackTrace();
    }
}

- 이런 코드를 좀더 깔끔하게 구현하면

try (FileInputStream fis = new FileInputStream("score.dat");
	DataInputStream dis = new DataInputStream(fis)) {
    
    (...생략...)
    
} catch (EOFException e) {
	...
} catch (IOException ie) {
	...
}

- try ()안에 객체를 생성하는 문장을 넣으면, try 블럭을 벗어나는 순간 close()는 자동으로 수행된다.

728x90

'개발 > Java&Kotlin' 카테고리의 다른 글

[Spring] 스프링시큐리티 예제  (2) 2022.08.29
[JPA] LIKE 정리  (0) 2022.08.24
[Spring] Message 적용해보기  (0) 2022.08.21
[Spring] Validation 적용해보기  (0) 2022.08.18
[Spring] 스웨거(Swagger) 라이브러리  (1) 2022.08.17