본문 바로가기
JAVA

JAVA | 예외처리

by 개발송이 2022. 2. 12.

ch 8 예외처리

 

1.예외처리 exception handling

1.1 프로그램 오류

컴파일 에러 : 컴파일 할 때 발생하는 에러

런타임 에러 : 실행할 때 바생하는 에러

논리적 에러 : 작성 의도와 다르게 동작

 

-Java의 런타임 에러

에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

예외 : 수습될 수 있는 미약한 오류

->에러는 어쩔 수 없지만 예외는 처리하자

예외처리 -> 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지

 

Exception클래스와 자손클래스 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

RuntimeException클래스와 자손클래스 : 프로그래머의 실수로 발생하는 예외

 

1.3 예외 처리하기 - try-catch문

try {
    //예외가 발생할 가능성이 있는 문장 넣음
} catch (Exception1 e1) {
    //Exception1이 발생했을때 이를 처리하기 위한 문장
} catch (Exception2 e2) {
    //Exception2이 발생했을때 이를 처리하기 위한 문장
}

*if문과 달리 try블럭이나 catch블럭 내에 있는 문장이 하나여도 { }생략 불가능

 

1.4 try-catch문 흐름

 

 try 블럭 내에서 예외 발생한 경우

1. 발생한 예외와 일치하는 catch블럭이 있는지 확인함

2. 일치하느 catch블럭 찾으면 그 catch블럭 내의 문장 수행하고 전체 try-catch문 빠져나가서 그 다음 문장 계속해서 수행. 일치하는 catch블럭 없으면 예외 처리 불가능

 

try블럭 내에 예외 발생하지 않으면

1.catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속함

class Ex7 {
	public static void main(String[] args) {
		System.out.println(1);
		System.out.println(2);
		try {
			System.out.println(3);
			System.out.println(0/0);
			System.out.println(4); //실행되지 않음
		} catch (ArithmeticException ae) {
			if(ae instanceof ArithmeticException)
				System.out.println(true);
		    System.out.println("ArithmeticException");
		} catch ( Exception e) { //Exception은 모든 예외의 최고조상이라 모든 예외 처리 가능
			System.out.println("Exception");
		}
		System.out.println(6);
	}

}

-예외가 발생하면, 이를 처리할 catch블럭을 찾아 내려감

-일치하는 catch블럭이 없으면, 예외는 처리 안됨

-Exception이 선언된 catch블럭은 모든 예외 처리(마지막 catch블럭)

 

 

printStackTrace() 메서드

예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력함

getMessage() 메서드

발생한 예외클래스의 인스턴스에 저장한 메시지를 얻을 수 있음

class Ex8 {
	public static void main(String args[]) {
		System.out.println(1);
		System.out.println(2);
		
		try {
			System.out.println(3);
			System.out.println(0/0);  //예외발생
			System.out.println(4);	  //실행안됨
		} catch (ArithmeticException ae) {
			ae.printStackTrace();
			System.out.println(ae.getMessage());
		}
		
		System.out.println(6);
		
	}
}

멀티 catch블럭

-내용이 같은 catch블럭을 하나로 합친 것

-부모자식관게인 catch블럭은 멀티catch블럭으로 못 씀

-참조변수로는 공통된 부분만 사용가능함

 

 

1.6 예외 발생시키기

 

1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음

Exception e = new Exception("고의로 발생시킴");

2. 키워드 throw를 이용해서 예외를 발생시킨다

throw e;

 

-checked예외 : 컴파일러가 예외 처리 여부를 체크(예외 처리 필수)

-unchecked예외 : 컴파일러가 예외 처리 여부를 체크 안함 (예외 처리 선택)

 

 

 

1.7 메서드에 예외 선언하기

 

-예외처리하는 법 : try-catch문(직접 처리), 예외 선언하기(예외 떠넘기기 알리기), 은폐

-메서드가 호출시 발생가능한 예외를 호출하는 쪽에 알리는 것

void method() throws Exception1, Exception2, ''' ExceptionN {
	//메서드 내용
}

*예외 발생시키는 키워드 throw와 예외 선언할때 쓰는 thows구분하기

 

public class Ex12 {

	public static void main(String[] args) throws Exception {
		method1();  //같은 클래스내의 static멤버라 객체생성없이 호출가능
	}				//이거도 try-catch없어서 떠넘김 그래서 비정상종료됨
	
	static void method1() throws Exception {
		method2();  //try-catch없어서 여기서도 예외처리 못하고 폭탄 떠넘김
	}
	
	static void method2() throws Exception {
		throw new Exception(); //예외발생했고 이건 죽고 예외 떠넘김
	}
}

 

 

1.8 finally 블럭

-예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.

try {
	//예외가 발생할 가능성이 있는 문장 넣음
} catch (Exception1 e1) {
	//예외 처리를 위한 문장 넣음
} finally {
	//예외의 발생여부와 관계없이 항상 수행되어야하는 문장 넣음
	//finally블럭은 try-catch문의 맨 마지막에 위치해야함
}

*try블럭 안에 return문이 있어서 try블럭을 벗어날 때도 finally블럭이 실행됨

 

 

1.10 사용자 정의 예외 만들기

-우리가 직접 예외 클래스를 정의할 수 있다.

-조상은 Exception과 RuntimeException중에서 선택

class MyException extendsE Exception {
    MyException(String msg) {
        super(msg);  //조상인 Exception클래스의 생성자 호출
    }
}

 

 

1.11 예외 되던지기 exception re-throwing

-예외를 처리한 후에 다시 예외를 발생시키는 것

-호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것

 

 

1.12 연결된 예외

-한 예외가 다른 예외를 발생시킬 수 있다.

-예외 A가 예외 B를 발생시키면 A는 B의 원인 예외

Throwable initCause(Throwable cause)  //지정한 예외를 원인 예외로 등록
Throwable getCause()  //원인 예외를 반환

이유1) 여러 예외를 하나로 묶어서 다루기 위해서

이유2) checked예외를 unchecked예외로 변경하려 할 때

'JAVA' 카테고리의 다른 글

JAVA | java.lang 패키지  (0) 2022.02.14
JAVA | 인터페이스 장점, 내부 클래스  (0) 2022.02.11
JAVA | 추상클래스, 인터페이스  (0) 2022.02.10
JAVA | final 상수  (0) 2022.02.06
JAVA | 재귀호출, 변수의 초기화  (0) 2022.02.05