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 |