06. Exception

2020. 1. 20. 09:22CSE/JAVA

* Exception(일반 예외)

: 컴파일러 체크 예외

  자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요하지 않음

  일반 예외 클래스 : Exception을 상속받지만 Runtime Exception을 상속받지 않는 클래스

 

* Runtime Exception(실행 예외)

: 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외

  개발자의 경헝메 의해서 예외 처리 코드를 삽입해야 함

  실행 예외 클래스 : Exception, Runtime Exception을 상속받는 클래스

  

  • NullPointerException : 객체 참조가 없는 상태, null값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생
  • ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
  • NumberFormatException : parseXXX() 메소드 이용 시, 숫자로 변환될 수 없는 문자가 포함되어 있을 때 발생
  • ClassCastException : 상위 클래스와 하위 클래스 관계가 아닌데 억지로 타입변환을 시도할 경우 발생
                               타입 변환 전에 타입 변환이 가능한지 instanceof으로 확인하면 좋음

 

* 예외 처리 코드

: 프로그램에서 예외가 발생했을 경우, 프로그램의 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드

  try-catch-finally 블록을 이용

public class TryCatchFinallyExample{
	public staic void main(String[] args){
    	try {
        //예외 발생 코드
        
            Class c = Class.forName("java.lang.String2");
            //Class.forName() : 클래스 존재 확인하는 메소드
      	} catch (ClassNotFoundException e){
        //예외처리
        
        	System.out.println("클래스가 존재하지 않습니다.");
      	} finally {
        //항상 실행
        
        	System.out.println("TryCatchFinallyExample 종료");
       }
  	}
}

 

* 다중 catch

: 다양한 종류의 예외를 잡기 위함

  catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행됨

  => 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 함

  ex. Exception > ArrayIndexOutOfBoundsException 이므로 Exception이 아래쪽에 위치해야 함

 

* 멀티 catch

: 하나의 catch 블록에서 여러 개의 예외를 처리할 수 있음

  catch 괄호 안에 동일하게 처리하고 싶은 예외를 |로 연결하면 됨

  ex. catch (ArrayIndexOutOfBoundsException | NumberFormatException e)

 

* 자동 리소스 닫기

: 예외 발생 여부와 상관 없이 사용했던 리소스 객체의 close() 메소드를 호출해서 리소스를 닫아준다

  try-with-resources 사용

 

+ 리소스 : ex. 입출력 스트림, 소켓 등

 

* 예외 떠넘기기

: 메소드 내부에서 예외가 발생할 수 있는 코드를 만들 때, 메소드를 호출한 곳으로 예외를 떠넘길 수 있음

public class Example{
	public staic void main(String[] args){
    	try{
        	method();
       	} catch (ClassNotFoundException e){
        	System.out.println("ClassNotFoundException 발생");
       	}
  	}
}

public void method() throws ClassNotFoundException{
	Class c = Class.forName("java.lang.String2");
}

 

* 사용자 정의 예외 클래스

: 필드, 생성자, 메소드 선언을 포함할 수 있지만, 대부분 생성자 선언만 포함

  생성자는 두 개를 선언하는 것이 일반적

  => 기본 생성자, 예외 메세지 전달 위해 String 타입의 매개 변수를 갖는 생성자

 

public class PersonalException extends Exception{
	//Exception 클래스를 상속해야 함
    
    public PersonalException(){} //기본 생성자
    public PersonalException(String message){ //매개 변수를 갖는 생성자
    	super(message);
  	}
}