혜야의 코딩스토리
[자바의 정석] 예외처리 본문
[프로그램 오류]
1. 컴파일 에러 : 컴파일할 때 발생하는 에러(실행 자체가 불가)
2. 런타임 에러 : 실행할 때 발생하는 에러(프로그램 종료)
3. 논리적 에러 : 작성 의도와 다르게 동작(프로그램 종료X)
[Java의 런타임 에러]
*에러는 어쩔 수 없지만, 예외는 처리하자!
-에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
-> 우리가 처리할 수 없음(ex. OOEM 메모리부족)
-예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
-> 우리가 코드를 작성하여 처리할 수 있음.
[예외처리의 정의와 목적]
-정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
-목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
[Exception과 RuntimeException]
1. Exception+자손 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
2. RuntimeException+자손 : 프로그래머의 실수로 발생하는 예외
[예외 처리하기. try-catch문]
try-catch문을 사용하여 예외 처리.
try 블록의 예외가 발생할 수 있는 문장들을 넣고, 그 예외에 대한 처리 문장을 catch 블럭에 넣는다.
이 때 { } 괄호는 for문이나 if문과 다르게 괄호 안 문장이 하나뿐일지라도 생략이 불가하다.
예외 처리하기 try-catch문 (괄호 생략불가)
try{ // 예외 발생 가능 문장 }
catch (Exception1 e1) { // 처리 }
catch (Exception2 e1) { // 처리 }
try 블록 내에서
1. 예외가 발생하면 일치하는 catch블럭 찾아서 수행 후 try-catch 빠저나감
못 찾으면 비정상 종료됨
2. 예외 발생하지 않으면 catch문을 수행하지 않고 빠져나감
[printStackTrace( )]
-예외 발생 당시 호출스택에 있던 메서드 정보와 메시지 출력
예외발생 -> 예외 객체 만들어짐-> 참조변수를 통해 객체에 접근 가능
[getMessage( )]
-발생한 예외클래스의 객체에 저장된 메세지
[멀티 catch블럭]
-{ }의 내용이 같은 catch블록을 하나로 합친 것, 중복제거
catch(ExceptionA | ExceptionB e)
->부모,자식 관계는 멀티catch블럭 사용불가
//(instanceof로 확인하기 때문에 조상만 써주면 됨. 굳이 자손 쓸 필요X)
-멀티 catch블럭 사용할 경우, 참조변수로는 두 예외 클래스의 공통 멤버만 사용 가능
[예외 발생시키기]
1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception(“고의로 발생시켰음”)
2. 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
[checked예외, unchecked예외]
-checked예외 : 컴파일러가 예외 처리 여부를 체크(예외 처리(try-catch) 필수)
-> Exception과 자손
-unchecked예외 : 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)
-> RuntimeException과 자손
[메서드에 예외 선언하기]
-예외를 처리하는 방법 :
1. 직접 처리 -> try-catch문
2. 예외선언하기(예외 떠넘기기,알리기) -> 키워드 throws사용
3. 은폐(덮기)-빈try-catch블럭 -> ex.빅데이터 처리(크롤링 등)
-메서드가 호출 시 발생가능한 예외를 호출하는 쪽에 알리는 것
-> 메서드 선언부에 throws입력, 그 뒤에 발생 가능한 예외 작성
-> 해당 예외 발생시 호출한 메서드로 예외가 넘어 감.
(떠넘겨진 예외를 처리하지 못할 경우 프로그램은 비정상 종료됨)
-> 작업중인 메서드에서 예외를 처리할지, 호출하는 다른 메서드에서 처리할지에 따라 try-catch블록을 사용할지 throws키워드를 사용할지 결정하면 된다.
***예외를 발생시키는 키워드 throw와
예외를 메서드에 선언할 때 쓰이는throws를 잘 구별하자. ***
***메서드 오버라이딩 조건 3가지***
1. 선언부가 일치해야 함
2. 조상보다 좁은 접근제어자 사용 불가
3. 조상보다 많은 예외 선언 불가 <----개념 등장
Exception클래스는 모든 예외의 조상이므로 Exception 하나가 여러 다른 예외클래스보다 많다.
[finally블럭]
-예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다. (try-catch문 마지막에 위치)
try{
//예외가 발생할 가능성이 있는 문장들을 넣는다.
}catch(Exception1 e1) {
//예외처리를 위한 문장을 적는다.
}finally {
//예외의 발생여부에 관계없이 항상 수행 되어야하는 문장들을 넣는다.
//finally블록은 try-catch문의 맨 마지막에 위치해야한다.
}
-finally는 return보다 강력해서 return문 이후에도 실행된다.
'꿈 : 멋진 개발자 🧸 > 자바의 정석' 카테고리의 다른 글
[자바의 정석] 컬레션 프레임웍(collections framework) (0) | 2022.05.23 |
---|---|
[자바의 정석] java.rang패키지와 유용한 클래스/ 날짜와 시간 & 형식화 (0) | 2022.05.23 |
[자바의 정석] 객체지향개념 수기 정리 :) (2) | 2022.05.08 |
추상 클래스 & 인터페이스 (0) | 2022.05.06 |
객체지향 프로그래밍 II (0) | 2022.05.06 |