Java

Java - 예외 및 예외 처리 ( Exception )

비뀨_ 2022. 2. 28. 01:17

예외란 ??

예외는 사용자의 조작이 이상하거나, 개발자의 코딩이 잘못되었을 때 발생하는 프로그램 오류이다.

 

예외(Exception) vs 에러(Error)

https://ko.gadget-info.com/difference-between-error 

 

Java에서 오류와 예외의 차이점

오류와 예외의 중요한 차이점은 시스템 리소스 부족으로 인해 오류가 발생하며 코드로 인해 예외가 발생한다는 것입니다.

ko.gadget-info.com

여기 잘 설명되어 있으니, 이걸 읽어보면 좋을 것 같다.

요약하자면

에러는 시스템 자원이 부족해서 발생하며 복구 불가함.

예외는 코드가 잘못되어서 발생하며 예외처리를 통해 복구 가능함.

 

자바에서는 예외가 발생할 가능성이 높은 코드를 컴파일 시 예외처리 유무를 확인한다.

예외처리가 되지 않아 있다면 컴파일이 되지 않음.

 

예외

일반 예외와 실행 예외가 있다.

일반 예외 ( Compiler Check Exception : 컴파일러 체크 예외 ) 

위에서 말했듯이 자바는 컴파일하는 과정에서 예외 발생 확률이 높은 코드에 대해서 예외처리 유무를 확인하는데,

예외처리 코드가 없으면 컴파일 오류가 발생한다.

 

실행 예외 ( Compiler None Check Exception ) 

실행 시 예측할 수 없이 갑자기 발생한 예외. 

컴파일 과정에서 예외 처리 코드가 있는지 검사하지 않기 때문에 발생.

 

예외 클래스

자바에서는 예외를 클래스로 관리한다. JVM ( Java Virtual Marchine)이 프로그램을 실행하는 중에 예외가 발생하면 

해당 예외 클래스로 객체를 생성해 

만들어진 예외 객체를 예외 처리 코드에서 이용할 수 있도록 해준다.

 

모든 예외의 최상위 클래스는 java.lang.Exception이다.

 

일반 예외와 실행 예외의 차이는 실행 유무라고 볼 수 있는데,

간단하게 RuntimeException 하위 클래스라면 실행 예외 , 그렇지 않으면 일반 예외라고 볼 수 있다.

 

실행 예외 클래스

실행 예외는 자바 컴파일러가 체크하지 않기 때문에 개발자가 예외 처리 코드를 작성해야 한다.

만약에 예외 처리를 하지 않았다면 예외 발생 시 프로그램은 종료한다.

 

 

대표적인 실행 예외 클래스

대표적인 예외 클래스이지만. 예외 이름만 봐도 웬만하면 알 수 있기 때문에 외우진 말기.

  • NullPointerException - 객체 참조가 없는 상태. null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생 
  • ArrayIndexOutBoundsException - 인덱스 범위를 벗어난 것을 사용할 때 발생.
  • NumberFormatException - 숫자로 변환할 수 없는 문자가 있을 때.
  • ClassCastException - 자바에서의 다형성으로 상위 클래스와 하위 클래스 간에 타입 변화를 할 수 있다. 
                                하지만 상위 하위 관계가 아닌데 변환한다면 발생하는 에러.

예외 처리

위에서 말한 대로 예외처리 코드가 있다면 프로그램이 비정상적으로 종료하지 않을 수 있기 때문에. 

개발자는 예외 처리를 제대로 해 주어야 한다.

 

 

기본적으로 사용 문법은 다음과 같다. 

try{//실행할 코드를 작성
	
}catch(예외클래스 e ){// 예외가 발생했을 때 해당 예외를 () 안에 적고 처리할 코드를 작성

}finally{
	// 예외가 생기든 안 생기든 실행하는 코드
}

catch 문은 아래와 같이 예외 처리할 만큼 여러번 사용할 수 있다.

try{//실행할 코드를 작성
	
}catch(ArrayIndexOutOfBoundsException e ){// 하위 예외 클래스 먼저 작성해야 이쪽에 들어감.

}catch(Exception e ){// 상위 예외 클래스는 밑에 위치하는게 개발자가 원하는 대로 흘러감

}finally{
	// 예외가 생기든 안 생기든 실행하는 코드
}

catch의 순서

다중 catch문을 쓸 때에는 위처럼 사용할 수 있지만, Exception이 위로 올라간다면 모든 예외는 Exception을 상속하기 때문에 제일 큰 Exception으로 다 예외가 들어가면서 의도와 다르게 흘러갈 수 있기 때문에 하위 -> 상위 예외 클래스로 catch 문을 작성하는게 바람직하다.

 

 

예외 떠넘기기 throws

try - cath 문 이외에도 예외를 처리 할 수 있는 방법이 있는데 , throws라는 키워드이다.

 

public void run1(){
	try{
    	run2();
    }catch(Exception e){
    	//예외 처리 코드
        System.out.println("예외 떠넘기기 받음");
    }
}

public void run2() throws Exception{
	Class c1 = Class.forName("java.lang.없는클래스");
}

위를 보면 run1 메소드에서 run2 메소드를 호출하고  run2 메소드는 throws로 예외를 떠넘긴다.

만약 c1이 클래스를 찾지 못해서 에러가 난다면 run2를 실행한 run1에서 예외처리를 하게된다.

예외처리를 넘기려면 run2 메소드는 꼭 호출 되는 곳의 try 문 안에서 실행되어야 한다.