예외란 문법적인 오류는 없어 프로그램이 실행은 되지만 특수한 상황을 만나면 프로그램이 중단되는 현상을 말한다.
예외처리에 대해서 알아보기 전에 흔히 혼동할 수 있는 3가지 개념에 대해서 먼저 짚고 넘어가보자.
오류: 에러와 예외를 포괄하는 개념
에러: 프로그램 코드에 의해서 해결 할 수 없는 심각한 오류
예외: 특수한 상황이 발생하면 프로그램이 중단되는 현상으로 프로그램 코드에 의해서 해결 할 수 있는 오류
에러
에러는 컴파일 에러와 런타임 에러로 나뉘어 진다.
컴파일 에러: 문법, 자료형 등이 일치하지 않을 떄 발생하는 에러
런타임 에러: 컴파일은 완료하였지만, 실행도중에 발생하는 오류
자바는 런타임이 발생하는 오류를 에러와 예외로 구분하고 있다;
우리는 예외에 대해서 알아보도록 하자.
Runtime exception
Runtime exception은 다시 5가지로 나뉘어진다.
ClassCastException: 객체 형변환을 잘못한 경우
ArithmeticException: 0으로 나누는 경우
NeagativeArraySizeException: 배열의 크기가 음수인 경우
NullPointerException: null객체에 접근하는 경우
IndexOutofBoundException: 인덱스의 범위를 벗어난 경우
예외 처리
예외 처리는 try catch 구문으로 진행할 수 있다.
public class ExceptionEx {
public static void main(String[] args) {
try {
int[] ary = { 1, 2, 3 };
System.out.println(ary[3]);
System.out.println(3 / 0);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없음");
// TODO: handle exception
} catch (IndexOutOfBoundsException e) {
System.out.println("인덱스 범위 초과");
} catch (Exception e) {
System.out.println("예외 발생");
} finally {
System.out.println("무조건 실행");
}
}
}
// 인덱스 범위 초과
// 무조건 실행
catch 구문은 여러개를 사용하여 여러 에러를 대처할 수 있다.
그러나 상위 catch 구문이 실행되는 순간 하위 catch 구문은 진행되지 않으니 가장 큰 범위의 Exception 인터페이스는 마지막에 쓰도록 한다.
finally는 예외가 발생해도 진행되고, 발생하지 않아도 진행되는 구문이다.
예외 강제 발생
사용자가 특정 상황에서 예외를 발생시키고 싶은 경우에 사용하는 방법이다.
public class ExceptionEx2 {
public static void main(String[] args) {
try {
throw new Exception("예외발생 예외발생 긴급상황");
} catch (Exception e) {
// TODO: handle exception
System.out.println("예외를 강제로 발생시킨 상황입니다.");
e.getMessage();
}
System.out.println("프로그램 종료");
}
}
// 예외를 강제로 발생시킨 상황입니다.
// 프로그램 종료
Exception 객체를 생성할 때 생성자에 문자열 값을 넣어주게 되면 getMessage 매서드를 이용하여 출력할 수 있다.
예외 발생
public class ExceptionEx3 {
public static void main(String[] args) {
try {
first();
} catch (Exception e) {
// TODO: handle exception
System.out.println("main class 에서 예외 처리중!!!");
}
}
static void first() throws Exception {
try {
second();
} catch (Exception e) {
// TODO: handle exception
System.out.println("first class에서 예외 처리중!!!");
System.out.println(e.getMessage());
}
}
static void second() throws Exception {
try {
throw new Exception("제가 강제로 예외 발생시켰어요!!!");
} catch (Exception e) {
System.out.println("second class에서 예외 처리중!!!");
throw e;
// TODO: handle exception
}
}
}
// second class에서 예외 처리중!!!
// first class에서 예외 처리중!!!
// 제가 강제로 예외 발생시켰어요!!!
위 코드는 main -> first -> second -> first -> main 의 순서로 진행되고 있다.
second class까지 진행이 되었을 때 에러가 발생하였고 try 에서 catch 구문으로 이동한다.
catch 구문에서는 새로운 에러를 강제로 발생시키고 있으며 이 에러는 클래스에서 정의한 throw Excetpion을 통하여 first class로 전달이 된다.
first class의 catch 구문이 작동이 되고 이때 getMessage가 print 되는 것을 확인할 수 있다.
사용자 정의 예외 클래스
public class LoginException extends Exception {
LoginException(String msg) {
super(msg);
}
}
import java.util.Scanner;
public class ExceptionEx4 {
static final String userId = "1234";
static final String userPasswd = "1234pw";
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.println("id 를 입력하세요");
String id = sc.nextLine();
System.out.println("password 를 입력하세요");
String passwd = sc.nextLine();
if (!userId.equals(id)) {
throw new LoginException("id가 일치하지 않습니다.");
} else if (!userPasswd.equals(passwd)) {
throw new LoginException("passwd가 일치하지 않습니다.");
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
}
}
// id 를 입력하세요
// 1234
// password 를 입력하세요
// 1234
// passwd가 일치하지 않습니다.
'공부방 > JAVA' 카테고리의 다른 글
mysql (0) | 2022.07.07 |
---|---|
Map, Hash table (0) | 2022.06.19 |
일급 컬렉션 (0) | 2021.08.15 |
[JAVA] enum 이란? (0) | 2021.07.14 |
상속 (0) | 2021.07.13 |