반응형
프로그램 오류
프로그램 오류의 종류
- 컴파일 에러 : 컴파일할 때 발생하는 에러
- 런타임 에러 : 실행할 때 발생하는 에러
- 논리적 에러 : 사용자의 작성 의도와는 다른 동작 수행
예외처리 정의와 목적
Java 의 런타임 에러 - 에러(Error)와 예외(Exception)
- 에러 (Error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
- 예외 (Exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
예외처리 정의와 목적
- 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성
- 목적 : 프로그램의 비정상 종료를 막고, 정상 실행상태를 유지하는 것
예외 클래스의 계층구조
- RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외
- Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
예외처리구문 try-catch
try {
// 예외가 발생할 가능성이 있는 문장 기입
} catch(Exception1 e1) {
// Exception1 이 발생했을 경우, 이를 처리하기 위한 문장을 기입
} catch(Exception2 e2) {
// Exception2 이 발생했을 경우, 이를 처리하기 위한 문장을 기입
} catch(Exception3 e3) {
// Exception3 이 발생했을 경우, 이를 처리하기 위한 문장을 기입
} catch(ExceptionN eN) {
// ExceptionN 이 발생했을 경우, 이를 처리하기 위한 문장을 기입
}
- try 블럭 내에서 예외가 발생하지 않으면, catch 블럭을 거치지 않고 빠져나옴
- try 블럭 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch 블럭이 있는지 확인
- 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내 문장들을 수행하고
전체 try-catch 문을 빠져나가서 그 다음 문장 계속 수행
만일 일치하는 catch 블럭을 찾지 못하면 예외는 처리되지 못함
예외 객체에 대한 메소드
- 발생한 예외 객체를 catch 블럭의 참조변수로 접근할 수 있음
printStackTrace()
: 예외가 발생할 때 호출스택 (Call Stack) 에 있었던 예외 메시지와
메소드의 정보를 화면에 출력getMessage()
: 예외 클래스 인스턴스에 저장된 메시지를 획득
finally 블럭
- 예외의 발생여부와 관계없이 실행되어야 하는 코드를 넣음
- 선택적으로 사용할 수 있으며 try-catch-finally 순서로 구성
- 예외 발생 시, try-catch-finally 순서로 실행됨
- 예외 미발생 시, try-finally 순서로 실행됨
- try 또는 catch 블럭에서 return 문을 만나도 finally 블럭은 수행됨
try {
...
} catch(Exception e) {
...
} finally {
// 예외 발생유무와 관계없이 항상 수행하는 문장을 기입
// finally 블럭의 위치는 try-catch 문의 마지막 부분
}
예외 발생시키기
- 예외 클래스 객체 생성
Exception e = new Exception(”예외 발생”);
- 키워드 throw 를 이용해서 예외를 발생시킴
throw e;
try {
Exception e = new Exception("예외 발생");
throw e;
// throw new Exception("예외 발생");
} catch(Exception e) {
e.printStackTrace();
System.out.println("에러 메시지 : " + e.getMessage());
}
메소드에 예외 선언하기
- 예외를 처리하는 방법
- 직접 처리 : try-catch 문으로 예외 처리
- 간접 처리 : 예외 선언 (예외 전달)
- 메소드를 호출할 때 예외를 처리하는 것이 아니라, 호출한 메소드로 전달해주는 것
- 호출한 메소드에서 예외처리를 해야만 할 때 사용
public static void main(String[] args) throws Exception {
method1();
}
static void method1() throws Exception {
method2();
}
static void method2() throws Exception {
throw new Exception();
}
메소드에서 예외를 던지는 경우 throws
!
향상된 예외처리 (try-with-resources)
- try 코드 블럭이 끝난 이후 자동으로 자원을 해제해주는 기능
- finally 블럭이나 모든 catch 부분에 자원 해제를 처리해주지 않아 편리함
- 사용한 자원을 정상적으로 해제해주지 않고 사용하게 된다면?
- 메모리 Leak 으로 프로그램이 멈춤
향상된 예외처리 사용 전
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("파일.txt");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
finally 에서 FileInputStream 을 썼는지 확인하고 해제해줘야 함.
향상된 예외처리 사용 후
FileInputStream fileInputStream = null;
try (fileInputStream = new FileInputStream("파일.txt")) {
} catch (IOException e) {
e.printStackTrace();
}
예외가 발생하면 JVM 이 자동으로 close 를 호출해서 자원을 반납해준다 !
훨씬 간결하게 코드를 작성할 수 있다.
- 물론 모든 걸 적용할 수 있는 건 아니고, 이 객체가
AutoCloseable
인터페이스를 구현한 객체여야 함 ! - AutoCloseable 이 적용되어 있지 않다면 ?
- 상속 받아서
void close() throws Exception;
만 구현해주면 됨 !
- 상속 받아서
728x90
반응형