Java 예외 처리 (Exception, try catch)
프로그래밍 오류의 종류는 논리적 에러 (Logical Error), 컴파일 에러 (Compillation Error), 런타임 에러 (Runtime Error)가 있다.
논리적 에러 (Logical Error): 실행은 되지만 의도와 다르게 동작하는 것
컴파일 에러 (Compillation Error): 컴파일시에 발생하는 에러
런타임 에러 (Runtime Error): 실행중에 발생하는 에러
Java에서는 런타임 에러는 에러(error)와 예외(exception) 두가지로 구분한다.
에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 에러
예외(exception): 프로그램 코드에 의해서 수습될 수 있는 미약한 에러
에러(error)는 JVM에 문제가 생긴 것으로 개발자가 대처할 방법이 없다.
예외(exception)은 개발자가 대처할 수 있는 에러이다. try catch문으로 예외처리 할 수 있다.
Exception 클래스의 자식을 보면 RuntimeException과 그 외의 에러가 있다.
RuntimeException의 자식은 예외처리 하지 않아도 컴파일이 되지만, 그 외 exception들은 예외처리하지 않으면 컴파일이 되지 않는다.
Checked Exception: 꼭 예외처리해야하는 예외. 예외처리 하지 않으면 컴파일되지 않는다
Unchecked Exception: 예외처리하지 않아도 되는 예외.
Error와 RuntimeException은 Unchecked Exception이고, 그 외 Exception은 Checked Exception이다.
코드를 짜다 보면 별것 아닌 예외도 checked exception으로 등록 된 것이 꽤 많은데, 이유는 자바 언어를 처음 개발 했을 때 프로그래밍 경험이 적을 사람도 보다 견고하게 프로그램을 작성할 수 있도록 유도하기 위해서이다.
문법
try {
//예외발생할 가능성이 있는 명령어
}
catch (예외클래스 e) {
//예외처리
}
finally {
//예외가 발생하던 아니던 마지막에 실행될 명령어
}
try{}catch(예외클래스 e){}finally{}로 구성되며, finally는 선택사항이다.
대표적인 예외 클래스이다.
예외클래스 | 설명 |
Exception | 예외 클래스들의 부모 클래스 |
ArithmeticException | 어떤 수를 0으로 나누는 것과 같이 비정상 계산중 발생 |
NullPointerException | NULL 객체 참조시 발생 |
IllegalArgumentException | 메소드의 전달 인자값이 잘못될 경우 발생 |
IllegalStateException | 객체의 상태가 메소드 호출에는 부적합할 경우 발생 |
IndexOutOfBoundsException | index값이 범위를 넘어갈 경우 발생 |
InputMismatchException | 의도치 않는 입력 오류시 발생 |
UnsupportedOperationException | 객체가 메소드를 지원하지 않는 경우 발생 |
SecurityException | 보안 위반 발생 시 보안 관리 프로그램에서 발생 |
ProviderException | 구성 공급자 오류시 발생 |
NoSuchElementException | 구성요소가 그 이상 없는 경우 발생 |
ArrayStoreException | 객체 배열에 잘못된 객체 유형 저장시 발생 |
ArrayIndexOutOfBoundsException | 배열의 범위를 넘어선 인덱스를 참조할 때 발생 |
ClassCastException | 클래스 간의 형 변환 오류시 발생 |
EmptyStackException | 스택이 비어있는데 요소를 제거하려고 할시 발생 |
예시
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true) {
try {
int i = sc.nextInt();
System.out.println(100/i);
}
catch(InputMismatchException e) {
System.out.println("정수를 입력해주세요");
sc.next();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
콘솔로부터 정수를 읽어 100을 나눈 값을 출력하는 프로그램이다.
정수가 아닌 값을 입력하면 InputMismatchException가 발생하여 첫번째 catch문이 실행될 것이다.
0을 입력하는 등 InputMismatchException가 아닌 예외가 발생하면 두번째 catch문이 실행될 것이다.
예외 발생시키기
throw키워드를 사용해 에러를 발생시킬 수 있다.
예시
public class Main {
static void checkAge(int age) {
if (age < 18) {
throw new ArithmeticException("Access denied - You must be at least 18 years old.");
}
else {
System.out.println("Access granted - You are old enough!");
}
}
public static void main(String[] args) {
checkAge(15); // Set age to 15 (which is below 18...)
}
}
https://www.w3schools.com/java/java_try_catch.asp
-