예외(Exception)
프로그램을 실행할 때 발생할 수 있는 오류
예외 처리(Exception Handling)
예외가 발생된 경우 예외를 처리하기 위한 방법
1.try 영역에서 예외가 발생될 경우 예외 관련 인스턴스 생성
2.catch 영역에서는 try 영역에서 발생된 예외 인스턴스를 전달받아 참조변수에 저장하여 예외 처리 👉 catch 영역으로 스레드(프로그램 흐름) 이동
3.catch 영역은 여러개 작성 가능
4.finally 영역에는 예외 발생에 상관없이 무조건 실행될 명령 작성
try{
예외가 발생될 수 있는 명령;//예외 발생시 아래 명령은 실행X
...
}catch(예외클래스 참조변수){
예외처리명령;
}finally{//생략 가능
무조건 실행 명령; ...
}
예시: ArrayIndexOutOfBoundsException(배열의 요소 표현시 첨자를 잘못 사용한 경우)
int[] array = {10,20,30,40,50};
try {
// => ArrayIndexOutOfBoundsException이 발생된 경우 JVM이 자동으로 예외 처리
// => JVM의 예외처리는 예외가 발생된 경로를 상세하게 표현하여 출력 - 개발자 중심
// => 사용자 중심의 프로그램을 작성하기 위해 직접 예외 처리하는 것을 권장
for(int i=0; i<=array.length; i++) {
System.out.println("array["+i+"] = "+array[i]);
}
//예외가 발생된 명령 하단에 존재하는 명령은 미실행
//=> 예외가 발생되면 catch 구문으로 스레드(프로그램의 실행 흐름) 이동
System.out.println("[메세지] 프로그램이 정상적으로 실행 되었습니다.");
}catch (ArrayIndexOutOfBoundsException e) {//예외 인스턴스를 전달받아 참조변수에 저장
//catch 영역에 설정된 예외 클래스에 대한 예외 처리 명령 작성 - 메세지 출력
//예외 처리 명령 - 메세지 출력
System.out.println("[에러] 프로그램 실행에 예기치 못한 오류가 발생되었습니다.");
//Throwable.getMessage(): 예외 인스턴스의 오류 메세지를 반환하는 메소드
System.out.println("예외 메세지 ="+e.getMessage());
}finally {
//예외와 상관없이 무조건 실행될 명령을 작성하는 영역: 생략 가능
// => 자원에 대한 제거 명령을 구현할 경우 사용
System.out.println("무조건 실행되는 명령");
}
메소드에서 발생된 예외를 메소드를 호출한 명령으로 전달하는 것을 말한다.
예외를 전달한 메소드를 호출할 경우 try 명령을 이용하여 예외 처리한다.
접근 지정자 반환형 메소드명(파라미터,...) throws 예외클래스, 예외클래스,...{
예외 발생 명령;
...
}
Exception 클래스를 상속받아 작성한다.
//Exception 클래스 상속받음
public class 예외클래스 extends Exception{
public 예외클래스() {}
public 예외클래스(String message){
super(message);
}
}
if(조건문) throw new 예외클래스(메세지);
Exception 클래스 상속받아 예외 클래스 작성
public class PasswordMismatchException extends Exception{
private static final long serialVersionUID = 1L;
public PasswordMismatchException() {
}
public PasswordMismatchException(String message) {
super(message);
}
}
키보드로 정수값을 입력받아 저장된 비밀번호와 비교하여 결과를 출력하는 프로그램을 작성
public class PasswordMatchApp {
public static void main(String[] args) throws PasswordMismatchException {
Scanner scanner = new Scanner(System.in);
try {
System.out.println("비밀번호 입력>>");
int password = scanner.nextInt();//InputMisMatchException 발생
if(password!=1234) {//비밀번호가 맞지 않을 경우
//인위적으로 예외 인스턴스를 생성하여 예외 발생
//=> JVM에 의해 자동으로 예외 처리되는 예외가 아니므로 예외 처리하지 않으면 에러 발생
throw new PasswordMismatchException("[결과] 입력된 비밀번호가 다릅니다.");
}
System.out.println("[결과]입력된 비밀번호가 맞습니다.");
} catch (InputMismatchException e) {
System.out.println("[에러] 숫자만 입력 가능합니다.");
} catch(PasswordMismatchException e){
System.out.println(e.getMessage());
}finally {
//사용자원을 제거하는 명령 >> 예외에 상관없이 무조건 실행
scanner.close();
}
}
}