JAVA/공부

예외 처리

GaeGim 2022. 7. 11. 23:40
반응형
  • 예외 처리

프로그램이 멈출 때까지 프로그램을 가동해 끝까지 잘 마무리 해주도록 하는 것, (프로그램 강제종료 되지 않도록)

 

· 에러 : JVM 자체에서 발생하는 오류로, 개발자가 해결할 수 없는 오류.

· 예외 : 개발자가 해결할 수 있는 오류. (해결보단 차선책을 하는 것..)

 

 

· 예외 최상위 클래스 : Exception, 오류 최상위 클래스 : Error. 모두 Throwable 클래스를 상속받음.

-> 예외와 오류 모두 Throwable 클래스의 기능을 포함한다.

 

 

· Exception 클래스

1. 일반 예외 : Exception 클래스 직접 상속받는 예외 클래스. 컴파일 전에 예외 발생 문법을 검사. 예외 처리 하지 않으면 문법 오류 발생.

2. 실행 예외 : RuntimeException 클래스를 직접 상속받은 예외 클래스들이 처리하는 실행 예외는 컴파일 전이 아닌, 실행할 때 발생하는 오류로, 예외 처리를 따로 하지 않더라도 문법 오류가 발생하지 않는다. 하지만 대부분이 프로그램 강제 종료를 일으킨다.

 

 

 

  • 일반 예외 클래스

· InterruptedException

Thread.sleep() 메서드가 일반 예외를 일으킬 수 있어 예외처리 해줘야 한다.

 

· ClassNotFoundException

Class.forName("패키지명.클래스명")은 동적 메모리를 로딩하는 메서드로, 해당 클래스의 정보를 담고 있는 Class 타입의 객체를 리턴한다. 만일 해당 클래스가 존재하지 않으면 발생하는 예외로, 예외 처리가 필요하다.

 

· IOExeption

콘솔이나 파일에 데이터를 쓰거나 읽을 때 발생하는 예외로, 반드시 예외처리를 해줘야 한다.

 

· FileNotFoundException

파일을 읽을 때 해당 경로에 파일이 없으면 발생하는 예외. 실제 파일 존재 유무 상관없이 파일이 존재하지 않을 수 있는 가능성때문에 예외 처리를 해줘야 한다.

 

· CloneNotSupportedException

Cloneable 인터페이스를 상속하지 않은 클래스 객체를 복사하기 위해 clone() 메서드를 호출하면 발생하는 예외.

 

 

 

  • 실행 예외

문법 오류를 발생시키진 않지만 프로그램 강제 종료될 수 있는 예외.

 

· ArithmeticException

수학식으로 존재하지 않는 연산 등 연산 자체가 불가능할 때.

 

· ClassCastException

상속 관계에서 다운 캐스팅은 될 수도 안 될 수도 있다. 다운 캐스팅이 불가능한 상황에서 다운 캐스팅을 시도할 때 발생하는 예외

 

· ArrayIndexOutOfBoundsExcepiton

배열 인덱스를 잘못 사용했을 때 발생하는 예외

 

· NumberFormatException

문자열을 숫자나 실수로 변환할 때 숫자형식이 아닐 때 발생하는 예외

 

 

※ 문자열을 불리언으로 변환

Boolean.parseBoolean("true");	//true

문자열이 true일 때만 true를 반환하고 이외의 문자열, 심지어 공백칸은 모두 false를 리턴한다.

 

 

· NullPointerException

참조변수가 실제 객체를 가리키고 있지 않은 상태에서 필드나 메서드를 호출할 때 발생하는 예외

여기서 null은 위치값을 저장하는 참조 변수의 초기값으로만 사용할 수 있고 현재 가리키는 객체가 없다는 걸 의미한다.

 

 

 

 

  • 예외 처리 문법
try{
    //일반 예외, 실행 에외 발생 가능 코드
} catch(예외클래스명 참조변수명) {
    //예외 발생 시 처리 내용
} finally {
    //예외 발생 여부 상관없이 무조건 실행할 내용
}

catch(){} : 예외가 발생했을 때만 동작하고 예외 없을 시 실행되지 않음.

finally{}를 쓰면 try{}, catch(){} 각각에 있는 중복된 코드를 제거할 수 있다.

try{}와 catch(){}는 짝꿍으로, try{}를 작성하면 catch(){}를 적어줘야 한다.

 

만약 JVM이 생성해 넘겨준 객체 타입을 받을 catch(){} 블록이 없어 예외를 처리할 수 없을 때 예외 처리가 되지 않아 프로그램이 강제 종료된다.

 

 

 

  • 다중 예외 처리

catch(){}블록은 예외 타입에 따라 여러 개를 포함할 수 있다.

주의해야 할 사항은 try{} 블록에서 예외 발생하고 여러 개의 catch(){} 블록이 있을 때 실행할 catch(){} 블록의 선택 과정은 항상 위에서부터 확인한다는 것이다. 따라서 첫 catch(){} 블록이 Exception타입이면 어떤 예외이든 Exception타입의 catch(){}블록으로 예외 처리될 테니 두 번째 catch(){}블록은 절대 도달할 수 없는 코드(unreachable code)가 되어 오류가 발생하게 된다. 오류 발생을 예방하기 위해 두 catch(){} 블록의 순서를 바꿔주면 된다.

->여러 catch(){} 블록이 있을 때 첫 블록을 Exception타입으로 두지 말라는 의미다.

 

또 같은 예외 처리 내용일 때 1개의 catch(){} 블록을 OR기호(|)로 2개처럼 이용할 수 있다.

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

 

 

 

  • 예외 전가

예외 발생 시 바로 처리시킬 수도 있지만 자신을 호출한 지점으로 예외를 전가할 수도 있다.

예외를 전가하면 예외 처리의 의무를 호출한 메서드가 갖게 된다.

 

· 문법

리턴타입 메서드명(입력매개변수) throws 예외 클래스명{
	// 예외 발생 코드
}
void abc() {	//직접 예외 처리
    try {
  	  bcd();
    } catch(Interrupted e) {
    	//예외 처리 구문
    }
}

void bcd throws InterruptedException{	//예외 전가
    Thread.sleep(1000);
}

bcd() 메서드는 직접 예외 처리를 하기 보다 InterruptedException이 자신을 호출한 메서드로 전가했다.예외 처리의 의무를 자신을 호출한 메소드로 전가한 것이다.

 

메서드에서 전가된 예외는 타고 타고 최상위 메서드인 main() 메서드까지 올라가고 여기서 예외를 전가하면 JVM이 직접 예외 처리하게 된다.

 

 

· 여러 예외를 쉼표(,)를 이용해 한 번에 전가할 수 있다.

문법)

리턴타입 메서드명(입력매개변수) throws 예외클래스A, ... {
	//여러 개의 예외 종류가 발생할 수 있는 블록
}

 

 

 

  • 사용자 정의 예외 클래스

1. 사용자 정의 예외 클래스 작성

2. 사용자 정의 예외 객체 생성

3. 예외 상황에서 예외 객체 던지기 : 실제 JVM에게 예외 객체 만들어 전달(throw 키워드)

throw : 예외 객체 던지는 기능

throws : 예외 전가

 

예외 처리 방법

1. throws 이후 예외 직접처리하거나 예외를 전가하는 구문을 작성. 예외 전가 시 예외 객체를 상위 메서드 내 예외 처리 블록으로 전달한 것이다.

2. 메서드가 직접 예외 처리할 때 JVM이 전달받은 예외 객체를 해당 메서드 내 예외 처리 블록으로 전달할 것이다.

 

 

· 예외 클래스 메서드

getMessage() : 예외 발생 시 생성자로 넘긴 메세지를 문자열 형태로 리턴하는 메서드

public String getMessage()

기본 생성자로 생성 시 null 리턴

문자열 입력매개변수로 받을 시 객체 생성했을 때 넘겨준 문자열을 리턴

 

printStackTrace() :  예외 발생이 전달되는 경로 확인할 수 있는 메서드

public void printStackTrace()

최초로 예외가 발생한, 제일 안 쪽에 있는 메서드순으로 출력됨

 

 

반응형

'JAVA > 공부' 카테고리의 다른 글

자바 AWT 이벤트  (0) 2022.09.01
스레드  (0) 2022.07.11
이너 클래스와 이너 인터페이스  (0) 2022.07.11
자바 제어자-2  (0) 2022.07.02
클래스 상속과 다형성  (0) 2022.07.02