본문 바로가기

Java

Java기초 예외처리

프로그램 오류의 종류

- 컴파일 에러 : 컴파일할 때 발생하는 에러

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

- 논리적 에러 : 사용자의 작성 의도와는 다른 동작 수행

 

 Java의 런타임 에러 - 에러(Error)와 예외(Exception)

- 에러(Error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

- 예외(Exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

 

예외처리의 정의와 목적

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

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

 

예외 클래스의 계층구조

- RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 에러

- Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

예외처리구문-try-catch

- 예외를 처리하려면 try-catch문을 사용해야 함

* try-catch문은 괄호 생략 불가

 

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

- catch 블럭을 거치지 않고 전체 try-catch문을 빠져나간 후 수행을 계속함

 

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

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

2. 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행 만일 일치하는 catch블럭을 찾지 못하면 예외는 처리되지 못함

System.out.println(1);
System.out.println(2);
try {
	System.out.println(3);
    System.out.println(0/4);
    System.out.println(4);
} catch (Exception e) {
	System.out.println(5);
}
System.out.println(6);

// 실행결과
// 1
// 2
// 3
// 5
// 6

 

- try블럭에서 예외가 발생하면, 발생한 예외를 처리할 catch블럭을 검색

- 첫 번째 catch블럭부터 순서대로 찾아 내려가며, 일치하는 catch블럭이 없으면 예외는 처리되지 않음

- 예외의 최고 조상인 Exception을 처리하는 catch블럭은 모든 종류의 예외가능(반드시 마지막 catch블럭이어야 함)

 

예외 객체에 대한 메서드

- 발생한 예외 객체를 catch블럭의 참조변수로 접근할 수 있음

- printStackTrace() : 예외가 발생할 때 호출스택(Call Stack)에 있었던 예외 메시지와 메서드의 정보를 화면에 출력

- getMessage() : 예외 클래스의 인스턴스에 저장된 메시지를 획득

 

finally 블럭

- 예외의 발생여부와 관계없이 실행되어야 하는 코드를 넣음

- 선택적으로 사용할 수 있으며, try-catch-finally의 순서로 구성됨

- 예외 발생시, try -> catch -> finally의 순서로 실행되고 예외 미발생시, try -> finally의 순서로 실행됨

- try 또는 catch 블록에서 return문을 만나도 finally 블럭은 수행됨

 

예외 발생시키기

1. 예외 클래스의 객체를 생성
- Exception e = new Execption("예외 발생");

2. 키워드 throw를 이용해서 예외를 발생시키

- throw e;

 

메서드에 예외 선언하기

- 예외를 처리하는 방법

-> 직접 처리 : try-catch 문으로 예외 처리

-> 간접 처리 : 에외 선언 (예외 전달)

 

- 메서드를 호출할 때 예외를 처리하는 것이 아니라, 호출한 메서드로 전달해주는 것

- 호출한 메서드에서 예외처리를 해야만 할 때 사용

void method() throws Exception1, Exception2, Exception3 {
	/* 구현 생략 */
}

향상된 예외처리(try-with-resources)

- try() 코드 블록이 끝난 이후 자동으로 자원을 해제해주는 기능

-> finally 블록이나 모든 catch 부분에 자원 해제를 처리해주지 않아 편리함

- 사용한 자원을 정상적으로 해제해주지 않고 사용하게 된다면?

-> 메모리 부족으로(Leak) 프로그램이 멈추게 됨

-> 자원을 사용한 뒤에는 반드시 해제를 해주어야 함

'Java' 카테고리의 다른 글

불편해서 직접만든 CapsLock 표시  (1) 2023.12.23
쓰레드  (0) 2022.12.06
제네릭스  (0) 2022.11.25