예외 처리를 하는 이유

  • 프로그램의 비정상 종료를 피하기 위해
  • 실행 오류(runtime error)가 발생했을 때 오류 log를 분석해서 수정하기 위해

오류와 예외

  • 시스템 오류 (error) : 가상 머신에서 발생, 프로그래머가 처리할 수 없는 오류
    동적 메모리가 없는 경우, 스택 메모리 오버플로우 등
  • 예외 (Exception) : 프로그램에서 제어할 수 있는 오류
    읽으려는 파일이 없거나 DB 연결이 안되는 경우 등
  • 자바는 안정성이 중요한 언어이기 때문에 프로그램에서 발생하는 오류에 대해 예외 처리를 해야한다

예외 클래스들

  • 모든 예외 클래스의 최상위 클래스는 Exception 클래스

Arithmetic Exception :정수를 0 으로 나눈 경우 발생
NullPointerException : 초기화 되지 않은 Object를 사용하는 경우
ArrayIndexOutOfBoundsException :배열의 크기를 넘어선 위치를 참조하려는 경우
FileNotFoundException :참조하는 파일이 지정된 위치에 존재하지 않는 경우
ClassNotFoundException :클래스가 로드되지 않은 경우
InterruptedException :Thread.sleep(), join(). Object의 wait()로 non-runnable 상태인 thread를 Runnable하게 만들 수 있도록 사용할 수 있음

예외 처리하기

try-catch문

  • try문에는 예외가 발생할 수 있는 코드를 작성하고
    예외가 발생하면
  • catch문 안에 있는 코드가 동작한다

try-catch-finally 문

  • finally 블럭에서는 파일을 닫거나 네트웍을 닫는 등의 리소스 해제의 역할을 구현한다
  • try 구문이 구행되는 경우에 funally 블럭도 항상 수행된다(return이 있어도)
  • 여러개의 예외 블럭이 있을 때 각각에서 리소스를 해제하는 것이 아닌 finally에서 공통으로 해제하도록 구현한다

try-with-resources 문

  • 리소스를 사용하는 경우 close()를 하지 않아도 자동으로 해제된다
  • 리소스를 try() 내부에 선언해야한다
    try (FileInputStream fis = new FileInputStream("a.txt"))
  • 해당 리소스 클래스가 AutoCloseable 인터페이스를 구현해야한다
    FileInputStream의 경우 구현하고 있다

예외 처리 미루기

  • try-catch로 미리 예외가 발생하는 상황에 대응하는 방법을 정해놓을 수도 있지만 사용하는 상황에서 대처하도록 미루는 방법이 있다
  • throws를 이용하면 예외가 발생할 수 있는 부분을 사용하는 문장에서 예외를 처리할 수 있다
public Class loadClass(String fileName, String className) throws FileNotFoundException, ClassNotFoundException{
		FileInputStream fis = new FileInputStream(fileName); //FileNotFoundException 발생
		Class c = Class.forName(className);  //ClassNotFoundException 발생
		return c;
	}

public static void main(String[] args) {

		ThrowsException test = new ThrowsException();
		
		try {
			test.loadClass("a.txt", "java.lang.String");
		
		}catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}
사용할 때 try-catch

멀티 Exception

  • 하나의 try문에서 여러 개의 Exception이 발생하면
    각각의 예외를 따로 처리할 수 있고
		try {
		test.loadClass("a.txt", "java.lang.String");
		
		}catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}

하나로 처리할 수 있다

	try {
	test.loadClass("a.txt", "java.lang.String");
	} catch (FileNotFoundException | ClassNotFoundException e) {
		e.printStackTrace();
	}

사용자 정의 예외 클래스

  • 자바에서 제공하는 예외 클래스 외에 직접 만들어야 하는 예외에 대해 직접 클래스를 만들어 사용한다
  • 기존 클래스와 가장 유사한 클래스를 상속받아 사용하면 되고 기본적으로 Exception 클래스를 상속하면 된다

패스워드 예외 처리하기

패스워드를 입력할 때 다음과 같은 경우 오류처리를 합니다.
비밀번호는 null일 수 없습니다.
비밀번호의 길이는 5이상입니다.
비밀번호는 문자로만 이루어져서는 안됩니다.(하나이상의 숫자나 특수문자를 포함)

오류 로그 남기기

loging

  • 시스템 운영 기록
  • 오류가 발생했을 때 오류에 대한 기록을 남겨, 디버깅에 용이하게 한다
  • 로그 파일에 기록하는 코드를 추가하여 필요한 정보가 로그로 남을 수 있도록 한다
  • 디버깅, 시스템 에러 추적, 성능 문제점 향상 등을 위해 사용한다
  • 로그를 너무 적게 남기면: 정확한 상황 파악이 어렵다
  • 로그를 너무 많이 남기면: 빈번한 파일 I/O 오버헤드와 로그 파일 백업 문제 등이 발생한다

java.util.logging

  • jer/lib/logging.properties 파일을 편집하여 로그 레벨을 변경할 수 있다
  • 패키지에서 제공하는 로그 레벨은 severe, warning, info, config, fine, finer, finest이다
  • 오픈소스는 log4j
logger.setLevel(Level.ALL);
fineFile.setLevel(Level.FINE);
warningFile.setLevel(Level.WARNING);
로그 파일들의 레벨을 다르게 할 수 있다

profile
안녕하세요. Chat JooPT입니다.

0개의 댓글