재밌고 어려운 IT를 이해해보자~!
Section 14. 예외 처리 본문
01. 예외 처리
에러(error)와 예외(exception)
자바 프로그램을 실행하다 갑자기 프로그램이 종료되거나, 예기치 못한 오류가 발생한다.
이러한 오류를 개발자가 처리해 에러 대신 개발자가 지정한 메세지를 출력하게할 수 있다.
자바는 에러 또는 예외가 발생할 경우, 해당 사항을 클래스로 관리한다.
컴파일 또는 실행 중에 문제가 발생하면 해당 문제에 따른 클래스 객체를 생성해서 예외들을 처리할 수 있다.
에러(error)
에러의 종류 | 상황 |
OutOfMemoryError | 프로그램 실행 중 메모리 부족 |
IOError | 입출력 에러 |
StackOverFlowError | 가용 메모리 부족 현상, 재귀 호출 문제 시 발생 |
예외(exception)
예외란 대체로 프로그램 구동 중에 나타나는 오류들을 말한다. 문법적으로는 문제가 없어 보이지만 실제 실행중에 생기는 문제다.
예외는 체크 예외, 비체크 예외가 있다.
체크 예외는 자바 소스를 컴파일하는 과정에서 검사하며, 보통 문법적으로 강제하여 예외 처리를 해야하는 경우.
비체크 예외는 컴파일 과정에서 검사하지 않으므로 사용자의 경험이나 테스트로 찾아야 하는 경우.
비체크예외를 만나면 개발자가 힘들다. ㅜㅜ
02. 예외 클래스
03. 예외 처리 문법
예외 처리 과정
- 코드 진행 중 예외 발생시 JVM에게 알림.
- JVM은 발생한 예외를 분석하여 알맞은 예외 클래스 생성.
- 생성된 예외 객체를 발생 지점으로 보냄.
- 예외가 발생한 지점에서 처리하지 않으면 프로그램 비정상 종료.
try - catch 구문
try {
//예외가 발생할 가능성이 있는 경우
} catch(예외클래스명 e) {
//예외 대신 실행할 코드
}
예외처리시 Exception 클래스를 사용하면 모든 예외 처리가 가능하다.
Exception은 모든 예외 클래스의 최상위 객체!
e는 변수다. 이 변수 앞의 Exception은 변수의 데이터 타입이 Exception이라는 의미다. Exception은 자바에서 기본적으로 제공하는 클래스로 java.lang에 소속되어 있다. 예외가 발생하면 자바는 마치 메소드를 호출하듯이 catch를 호출하면서 그 인자로 Exception 클래스의 인스턴스를 전달하는 것이다.
Exception의 변수명은 무조건 "e"로 해야되는 것 같다. 다른 변수명 사용불가..
e변수명을 사용해 다양한 메서드를 호출할 수 있다.
예를들어 e.getMessage()는 자바가 전달한 인스턴스의 메소드 중 getMessage를 호출하는 코드인데, getMessage는 오류의 원인을 사람이 이해하기 쉬운 형태로 리턴하도록 약속되어 있다.
다중 catch 사용하기
try {
} catch(NullpointerException e) {
} catch(ArithmeticException e) {
}
finally
finally 블록은 예외 발생 유무와 상관없이 실행되는 구문이며 생략 가능하다.
반드시 처리해야 하는 구문을 작성할 때 사용되며, 보통 외부 연동이나 예외가 발생해도 정상 종료가 되어야할때 사용.
try {
} catch(NullpointerException e) {
} finally {
scan.close();
}
예를들어 어떤 에러가 발생해서 catch문으로 예외처리를 하고 정상종료 될 뿐만 아니라, finally를 사용해
예외가 발생하더라도 안전하게 Scanner를 종료하고 프로그램을 종료할 수 있다.
04. 예외 던지기
메서드 내부에서 예외를 처리하지 않고 미룬 후, 해당 메서드를 호출한 쪽에서 예외를 처리하도록 하는 방법이 있다. 그것을 바로 '예외 던지기' 또는 '예외의 전가' 라고 한다. 떄로는 더 효율적이다!
throws키워드
예외 객체는 여러 개를 던질 수 있으며, 여러 개를 던질 시에 콤마(,)로 구분해 나열한다.
public int divide(int x, int y) throws
ArithmeticException {
Return x/y;
}
public static void main(Sttring[] args) {
int result = 0
try {
result = divide(10, 0);
} catch(ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
}
}
메서드가 길어지거나, 유지보수 측면에서 메서드내에서 예외처리를 하는건 효율이 떨어질 수도 있다.
메서드를 호출하는 쪽에서 처리하면 좀 더 수월하게 처리가능.
임의의 예외 처리 방법
프로그램의 규칙에 위배되어 예외를 강제로 발생시켜야 할 경우, 임의로 예외를 발생시킬 수 있다.
정의 | 예외 발생 상황이 아니더라도, 필요에 의해 강제로 예외 발생 |
발생 방법 | throw new 예외 객체(메세지); |
발생 위치 | try-catch 내부 또는 메서드에 예외 던지기가 있는 경우 |
용도 | 개발자가 예외를 의도하는 위치 |
package class01;
import java.util.Scanner;
public class Test06 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int val = 0;
while (true) {
try {
System.out.println("0~50");
val = scan.nextInt();
if (val == -1) {
break;
}
if (val < 0 || val > 50) {
throw new Exception("허용범위밖");
}
} catch (Exception e) {
scan.nextLine();
System.out.println(e.getMessage());
}
}
scan.close();
System.out.println("프로그램 종료");
}
}
05. 사용자 정의 예외 처리
자바가 제공하는 예외 객체 외에도 개발자가 예외 객체를 만들 수 있다.
최상위 객체인 Exception을 상속하여 예외 클래스를 만들어보자.
class InputErrorException extends Exception {
private String msg;
public InputErrorException(String msg) {
this.msg = msg;
}
@Override
public String getMessage() {
return this.msg;
}
}
Exception을 상속받아 메서드 getMessage를 오버라이딩
*참조
https://reakwon.tistory.com/155
https://allonsyit.tistory.com/65
'JAVA Book Study' 카테고리의 다른 글
Section 16. 컬렉션 프레임워크 (1) | 2024.01.01 |
---|---|
Section 15. 기본 API 클래스 (2) | 2024.01.01 |
Section 13. 내부 클래스 (0) | 2023.12.29 |
Section 12. 추상 클래스와 인터페이스 (1) | 2023.12.29 |
Section 11. 다형성과 타입 변환 (0) | 2023.12.29 |