혜야의 코딩스토리

[자바의 정석] 예외처리 본문

꿈 : 멋진 개발자 🧸/자바의 정석

[자바의 정석] 예외처리

hyeya_ 2022. 5. 14. 00:59

[프로그램 오류]

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문의 맨 마지막에 위치해야한다.

}

-finallyreturn보다 강력해서 return문 이후에도 실행된다.