15-1. 예외 클래스
프로그램에서의 오류
- 컴파일 오류 (compile error)
- 프로그램 코드 작성 중 발생하는 문법적 오류
- 최근에는 개발 환경에서 대부분의 컴파일 오류는 detection 함
- 실행 오류 (runtime error)
- 실행 중인 프로그램이 의도 하지 않은 동작(bug)을 하거나 프로그램이 중지 되는 오류
- 실행 오류는 비정상 종료가 되는 경우 시스템의 심각한 장애를 발생할 수 있음
예외 처리의 중요성
- 프로그램의 비정상 종료를 피하여 시스템이 원활하게 실행되도록 함
- 실행 오류가 발생한 경우 오류의 과정을 재현하는 것은 현실적으로 힘들다
- 오류가 발생한 경우 log를 남겨서 추후 log 분석을 통해 그 원인을 파악하여 buf를 수정하는 것이 중요
오류와 예외 클래스
- 시스템 오류 (error) : 가상 머신에서 발생, 프로그래머가 처리 할 수 없는 오류임
동적 메모리가 없는 경우, 스택 메모리 오버플로우 등
- 예외 (Exception) : 프로그램에서 제어 할 수 있는 오류
읽어들이려는 파일이 존재하지 않거나, 네트웍이나 DB연결이 안되는 경우 등
- 자바는 안정성이 중요한 언어로 대부분 프로그램에서 발생하는 오류에 대해 문법적으로 예외 처리를 해야함
예외 클래스들
- 모든 예외 클래스의 최상위 클래스는 Exception 클래스
- 자바에서는 다양한 예외들에 대해 그 처리를 위한 클래스가 제공되고 있음
- Arithmetic Exception : 정수를 0으로 나눈 경우 발생
- NullPointerException : 초기화 되지 않은 Object를 사용하는 경우
- ArrayIndexOutOfBoundsException : 배열의 크기를 넘어선 위치를 참조하려는 경우
- FileNotFoundException : 참조하는 파일이 지정된 위치에 존재하지 않는 경우
- ClassNotFoundException : 클래스가 로드되지 않은 경우
- InterruptedException : Thread.sleep(), join(). Object의 wait()로 non-runnable 상태인 thread를 Runnable하게 만들 수 있도록 사용할 수 있음
15-2. 예외 처리하기
try-catch 문
- try 블록에는 예외가 발생할 가능성이 있는 코드를 작성하고 try 블록 안에서 예외가 발생하는 경우 catch 블록이 수행됨
try { 예외가 발생할 수 있는 코드 부분 } catch (처리할 예외 타입 e) { try 블록 안에서 예외가 발생했을 때 예외를 처리하는 부분 } |
try-catch-finally 문
try { 예외가 발생할 수 있는 코드 부분 } catch (처리할 예외 타입 e) { try 블록 안에서 예외가 발생했을 때 예외를 처리하는 부분 } finally { 항상 수행되는 부분 } |
- finally 블럭에서 파일을 닫거나 네트웍을 닫는 등의 리소스 해제 구현을 함
- try{ } 블럭이 수행되는 경우, finally{ } 블럭은 항상 수행 됨
- 여러 개의 예외 블럭이 있는 경우 각각에서 리소스를 해제하지 않고 finally 블록에서 해제하도록 구현함
try-with-resources 문
- 리소스를 사용하는 경우 close() 하지 않아도 자동으로 해제 되도록 함
- 자바 7부터 제공되는 구문
- 리소스를 try{} 내부에서 선언해야만 함
- close()를 명시적으로 호출하지 않아도 try{} 블록에서 열린 리소스는 정상적인 경우나 예외가 발생한 경우 모두 자동으로 해제됨
- 해당 리소스 클래스가 AutoCloseable 인터페이스를 구현 해야 함
- FileInputStream의 경우에는 AutoCloseable을 구현하고 있음
- 자바 9 부터 리소스는 try() 외부에서 선언하고 변수만을 try(obj)와 같이 사용할 수 있음
15-3. 예외 처리 미루기
- 예외 처리는 예외가 발생하는 문장에서 try-catch 블록으로 처리하는 방법과 이를 사용하는 부분에서 처리하는 방법 두가지가 있음
- throws를 이용하면 예외가 발생할 수 있는 부분을 사용하는 문장에서 예외를 처리할 수 있음
하나의 try{ } 블록에서 예외가 여러개 발생하는 경우
- 여러 개의 예외가 발생하는 경우 예외를 묶어서 하나의 방법으로 처리할 수도 있고 (Surround with try/multi-catch)
- 각각의 예외를 따로 처리할 수도 있음 (Surround with try/catch)
15-4. 사용자 정의 예외
- 자바에서 제공되는 예외 클래스 외에 프로그래머가 직접 만들어야 하는 예외가 있을 수 있음
- 기존 예외 클래스 중 가장 유사한 예외 클래스에서 상속 받아 사용자 정의 예외 클래스를 만듦
- 기본적으로 Exception 클래스를 상속해서 만들 수 있음
IDFormatException.java
package exception;
public class IDFormatException extends Exception { // Exception 상속받기 public IDFormatException(String message) { //생성자의 매개변수로 예외 상황 메시지를 받음 super(message); // 예외 메시지 설정 } } |
IDFormatTest.java
package exception;
public class IDFormatTest { private String userID; public String getUserID() { return userID; } // 아이디에 대한 제약 조건 구현 public void setUserID(String userID) throws IDFormatException { // IDFormatException 예외를 setUserID()메서드가 호출될 때 처리하도록 미룸 if(userID == null) { throw new IDFormatException("아이디는 null일 수 없습니다"); //강제로 예외시킴 } else if(userID.length() < 8 || userID.length() > 20) { throw new IDFormatException("아이디는 8자 이상 20자 이하로 쓰세요"); //강제로 예외시킴 } this.userID = userID; } public static void main(String[] args) { IDFormatTest test = new IDFormatTest(); //아이디 값이 null인 경우 String userID = null; try { test.setUserID(userID); } catch (IDFormatException e) { System.out.println(e.getMessage()); } //아이디 값이 8자 이하인 경우 userID = "1234567"; try { test.setUserID(userID); } catch (IDFormatException e) { System.out.println(e.getMessage()); } } } |
15-5. 오류의 로그를 남기기 - java.util.logging.Logger 활용
logging
- 시스템 운영에 대한 기록
- 오류가 발생 했을 때 그 오류에 대한 기록을 남겨 디버깅을 용이하게 함
- 로그 파일에 기록하는 코드를 추가하여 필요한 정보가 로그로 남을 수 있도록 한다
- 디버깅, 시스템 에러 추적, 성능, 문제점 향상들을 위해 사용
- 어느 정도까지 로그를 남길 것인가?
- 너무 적은 로그 : 정확한 시스템의 상황을 파악하기 어려움
- 너무 많은 로그 : 빈번한 file I/O의 오버헤드와 로그 파일의 백업 문제 등
java.util.logging
- 자바에서 기본적으로 제공되는 log package
- 파일이나 콘솔에 로그 내용을 출력할 수 있음
- jre/lib/logging.properties 파일을 편집하여 로그의 출력방식 로그 레벨을 변경 할 수 있음
- logging 패키지에서 제공하는 로그 레벨은 severe, warning, info, config, fine, finer, finest
- log4j와 같은 오픈소스를 많이 사용하고 있음
'Programming Language > JAVA' 카테고리의 다른 글
람다표현식과 표준 API 함수적 인터페이스 (0) | 2023.09.06 |
---|---|
[Do it 자바 프로그래밍 입문] 16. 입출력 스트림 (0) | 2023.06.16 |
[Do it 자바 프로그래밍 입문] 14. 내부 클래스, 람다식, 스트림 (1) | 2023.06.15 |
[Do it 자바 프로그래밍 입문] 13. 컬렉션 프레임워크 (0) | 2023.06.14 |
[Do it 자바 프로그래밍 입문] 12. 자료구조 (1) | 2023.06.13 |