예외 처리 개요
| 오류의 종료 | |
| 에러(error) | 예외(ecxeption) |
| 하드웨어의 잘못된 동작 또는 고장으로 인한 오류 에러가 발생되면 프로그램 종료 정상 실행 상태로 돌아갈 수 없음 |
사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류 예외가 발생되면 프로그램 종료 예외 처리를 추가하면 정상 실행 상태로 돌아갈 수 있다 |
프로그램의 컴파일 과정에서 많은 에러가 발생한며
이 에러를 처리하는 과정을 디버깅(debugging)이라고 한다.
프로그램 작성 시 발생할 수 있는 에러는 문법적인 에러, 논리적인 에러가 있다
문법적인 에러 : 컴파일시 쉽게 해결가능하다
논리적인 에러 : 프로그램을 멉추게 하는 등의 문제가 발생한다.
여기서 예외란 프로그램 실행 중 발생할 수 있는 에러를 말한다.
예외의 종류
일반 예외 : 반드시 작성해야 컴파일 가능
실행 예외 : 컴파일러가 체크해주지 않으면 개발자 경험에 의해 작성
예외가 발생하는 경우의 예
- 정수를 0으로 나누는 경우
- 배열의 첨자가 범위를 벗어났을 경우
- 입출력 시 인터럽트가 발생한 경우
- 부적절한 형변환이 발생한 경우
- 지정한 파일이 존재하지 않을 경우
예외 처리를 위해 제공되는 클래스 : java.lang.Exception
Exception클래스는 java.lang.Trowable 클래스의 하위 클래스입니다.
( 하지만 모든 예외의 최고 조상은 Exception클래스이다.)
Trowable 클래스는 자바에서 예외 처리를 하기 위한 최상위 클래스
예외 정보 얻기
예외 클래스의 에러 메시지를 출력에 제공되는 메서드
- getMessage() : 해당 객체에 포함된 에러 메세지를 얻는다
- toString() : 예외 클래스와 해당 객체에 포함된 에러 메세지를 얻는다
- printStackTrace() : 예외가 발생하기까지의 메소드 호출 순서를 화면에 출력한다. 예외가 발생한 지점부터 맨 마지막에 호출한 메서드까지 역순으로 출력한다 ( 프로그램 테스트 시 오류 찾을 때 유용 )
- printStackTrace() : 예외발생 당시 호출스택에 있던 메서드 정보 및 예외 메세지 출력
- getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메세지 획득
예외 처리 방법
프로그램 실행 중 예외 발생시
자바 가상 머신이 Exception 객체를 발생시키고
이것을 해당 프로그램에게 알려준다
예외를 발생시킨 프로그램은
그 Exception객체를 받아 처리해주어야 한다
예외 처리 코드
예외 발생기 프로그램 종료를 막고, 정상 실행이 유지될 수 있도록 처리
try ~ catch
예외가 발생한 지점에서 직접 처리할 수 있다
try 문 블록에 있는 문장들이 catch 문 인수에서 지정한 예외가 발생시
catch문 블록에 기술된 명령을 실행한다
- 구문
try {
예외를 발생시킬 가능성이 있는 문장들;
} catch(예외 타입 매개변수) {
예외 타입의 예외가 발생할 경우 처리할 문장들;
}
다중 try ~ catch
try ~ catch 문에서 발생할 수 있는 예외가 여러 가지 일 경우
여러개의 catch문장을 제공해준다.
한 개 이상의 예외가 발생했다하더라도
자신의 예외와 동일한 예외를 catch블럭에서 가장 빨리 발견한
하나의 블럭만 수행한다
- 구문
try {
예외를 발생시킬 가능성이 있는 문장들;
} catch(예외 타입_1 매개변수) {
예외 타입의 예외가 발생할 경우 처리할 문장들;
} catch(예외 타입_n 매개변수) {
예외 타입의 예외가 발생할 경우 처리할 문장들;
}
catch의 순서 - 상위 클래스가 하위 클래스보다 아래에 위치해야 한다
멀티 catch
자바 7부터는 하나의 catch 블럭에서 여러 개의
예외 처리가 가능해졌다
동일하게 처리 하고 싶은 예외를 |(논리 연산의 or 기호)로 연결한다
try - with - resources (자동 리소스 닫기)
예외 발생 여부와 상관 없이 사용했던 리소스 객체(각종 입력스트림, 서버소켓, 소켓, 각종채널)
의 close()메소드를 호출하여 안전하게 리소스를 닫아준다
리소스 객체의 조건
java.lang.AutoCloseable 인터페이스 구현하고 있어야 함
다중 try ~ catch ~ finally
finally문은 예외 발생 유무에 상관없이 무조건 실행하는 구문이다
예외가 발생했을 경우 어떤 예외가 발생했을지라도 반드시
처리해야 하는 문장을 보통 넣는다
- 구문
try {
예외를 발생시킬 가능성이 있는 문장들;
} catch(예외 타입_1 매개변수) {
예외 타입의 예외가 발생할 경우 처리할 문장들;
} catch(예외 타입_n 매개변수) {
예외 타입의 예외가 발생할 경우 처리할 문장들;
} finally {
항상 실행할 필요가 있는 문장들;
}
Throws
예외가 발생한 메소드를 호출한 곳으로 예외 처리를 넘겨준다
throws 키위드가 있는 메소드를 사용할 때
try ~ catch 문으로 예외 사항을 반드시 처리해줘야 한다.
- 구문
접근 제한자 메소드 이름() throws 예외 클래스 이름 {
// 메소드가 수행할 작업;
}
- 구문 : 만약 넘겨야할 예외 종류가 여러개라면 쉼표(,) 를 기준으로 나열하여 선언한다
public void 메서드 명() throws 예외 클래스 이름_1, 예외 클래스 이름_2{
//예외 발생
}
반드시 예외 사항 처리가 필요한 곳
- 파일 입출력
- 메모리 입출력
- 데이터 베이스 입출력
- 네트위크 입출력
사용자 정의 예외 클래스 선언
자바 표준 API에서 제공하지 않는 예외
사용자 정의 예외 클래스 선언 방법
- 구문
public class 예외클래스이름Exception extends [ Exception | RuntimeException ] {
public 예외클래스이름Exception() { }
public 예외 클래스이름Exception(String message) { super(message); }
}
예외 발생 시키기
코드에서 예외 발생시키는 방법
- 구문
throw new 예외클래스이름Exception()
throw new 예외클래스이름Exception("메세지");
public void method() throws 예외클래스이름Exception {
throws new 예외 클래스 이름("메세지");
}
자신을 호출한 곳에서 예외 처리를
하도록 throws로 넘긴다
예외 처리 클래스
IOException 클래스
데이터를 입출력할 때 발생할 수 있는
에러 이벤트를 처리하는 클래스
NullPointerException 클래스
참조할 메모리가 없을 경우 발생하는 이벤트를 처리하는 클래스
(객체 참조가 없는 상태)
null 값 갖는 참조변수로 객체 접근 연산자인 도트(.) 사용했을 때 발생
String str = null;
System.out.println("문자열 : " + str.length);
String data = null;
System.out.println(data.toString());
ArrayIndexOutOfBoundsException 클래스
배열의 범위를 벗어났을 때(초과) 이벤트를 처리하는 클래스
FileNotFoundExxception 클래스
처리할 파일이 없을 경우 발생하는 이벤트를 처리하는 클래스
Exception 클래스
모든 예외 처리 클래스의 상위 클래스
모든 에러 이벤트는 Exxception 클래스를
상속받기 때문에, 모든 에러 이벤트 클래스를 x라고 할 때
Exception e = x; 형태로 업 캐스팅되기 때문이다
_
NumberFormatException
문자열을 숫자로 변환하는 경우
숫자로 변환될수 없는 문자가 포함되어 있을 경우
ClassCastException
타입 변환이 되지 않을 경우 발생
'JAVA > [JAVA] 예외 처리와 스레드' 카테고리의 다른 글
| 스레드 (0) | 2021.09.26 |
|---|