[Java] 예외 처리

chael_lo·2021년 5월 13일
0

Java

목록 보기
18/52

예외(Exception)
프로그램을 실행할 때 발생할 수 있는 오류

예외 처리(Exception Handling)
예외가 발생된 경우 예외를 처리하기 위한 방법

예외를 전달받아 처리하는 클래스

  • Throwable: 프로그램 오류 관련 정보를 저장하기 위한 최상위 클래스
    • Error: 하드웨어의 의해 발생하는 오류를 젖아하기 위한 상위 클래스
    • Exception: 소프트웨어에 의해 발생하는 오류를 저장하기 위한 상위 클래스

예외 클래스의 분류

  1. RuntimeException 클래스를 상속받지 않는 클래스
    👉 예외 처리를 하지 않은 경우 컴파일 에러가 발생
  2. RuntimeException 클래스를 상속받는 클래스
    👉 예외 처리를 하지 않아도 JVM이 자동으로 예외 처리

예외 처리 방법

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 명령을 이용하여 예외 처리한다.

  • 모든 예외를 한번에 처리하기 위해 사용한다.
  • JVM에게 예외를 전달할 경우 자동 예외 처리한다.
  • 주의! 예외 처리를 많이 사용하게 되면 가독성이 떨어질 수 있어서 하나의 코드에 작성하는 것이 좋다.
접근 지정자 반환형 메소드명(파라미터,...) 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();
		}
		
	}
}
profile
천천히 꾸준히

0개의 댓글