본문 바로가기

Java

예외

프로그램 오류 종류

  • 컴파일 에러 ( compile-time error ) : 컴파일 도중 발생하는 오류 
  • 런타임 에러 ( runtime error ) : 실행 도중 발생하는 오류 

 

 

예외 클래스 계층도

출처 : 개발자 노트 :: [JAVA] Exception 예외 클래스의 계층구조 (tistory.com)

Exception 타입의 클래스 ( RuntimeException 타입의 클래스 제외 ) : 외적인 요인에 의해 발생하는 예외

RuntimeExcaption 타입의 클래스 : 프로그래머의 실수로 발생하는 예외 

 

Exception을 처리하지 못하면 프로그램은 종료되며, 원인이 된 Exception을(uncaught exception) JVM의 UncaughtExceptionHandler가 받아서 화면에 출력해 준다. 

 

 

ArrayIndexOutODBoundsException의 상속 계층도

* 이클립스 상속 계층도 단축키 : ctrl + t

 

 

try-catch문

try {

    // 예외 발생 가능성 있는 코드

} catch (Exception e){

    // 예외 발생 시 동작하는 코드
} finally {

    // 예외 발생 여부 관계없이 무조건 실행하는 코드 

    // 예외 발생시 : try - catch - finally

    // 예외 발생 x : try - finally

}

public class Test { 
	
	public static void main(String[] args) {
		int[] a = new int[5];
		// ArrayIndexOutOfBoundsException예외 발생
		try {
			a[5] = 10;
		} catch (ArrayIndexOutOfBoundsException e) {
			System.err.println("배열의 범위를 벗어남");
			e.printStackTrace();
		}
	}
}

* 이클립스 단축키 : 범위주석 후 Alt + shift + z

 

예외 처리 과정 

try문에서 예외 발생 시 그 코드 다음부터는 실행되지 않으며 heap에 예외 타입의 인스턴스가 생성된다. catch문의 파라미터의 타입과 예외 인스턴스의 타입을 instanceof 연산자로 검사한 뒤 결과가 true이면 해당 catch블록을 실행한다.

 

public class Test { 
	
	public static void main(String[] args) {
		int[] a = new int[5];
		// ArrayIndexOutOfBoundsException예외 발생
		try {
			a[5] = 10;
		} catch (ArrayIndexOutOfBoundsException e2) {
			System.err.println("배열의 범위를 벗어남");
			e2.printStackTrace();
			System.out.println(e2.getMessage());
		}
	}
}

printStackTrace() : 예외 발생 당시 call stack에 있었던 메서드의 정보와 예외 메시지를 출력한다. (  return 타입 : void )

더보기

java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
at test.Test.main(Test.java:9)

getMessage() : 예외 인스턴스에 저장된 메시지를 출력한다. ( return 타입 : String )

더보기

Index 5 out of bounds for length 5

 

멀티 catch 블록 

두 예외클래스의 타입이 다르고 catch의 코드가 동일할 경우 하나의 catch문에 두 개의 클래스타입을 선언 작성 가능하다.

ex) 

try {

} catch ( 예외타입1 | 예외타입2 변수명 ) {
}

 

* 두 개의 타입이 부모 자식 관계일 경우 부모 타입으로 통일한다.  

* 멀티 catch 블록을 사용할 경우 하나의 타입에만 있는 메서드는 사용 불가능 ( 타입 구분 불가 )

  하지만 굳이 사용하려면 instanceof 연산자로 타입을 검사한 뒤 사용  

 

 

 

 

 

 

 

'Java' 카테고리의 다른 글

사용자 정의 예외  (0) 2023.05.24
throw, checked - unchecked 예외, throw  (0) 2023.05.23
익명 클래스(anonymous class)  (0) 2023.05.18
초기화 블록  (0) 2023.05.15
인터페이스(interface)  (0) 2023.05.12