백엔드/Java의 정석

TIL 정리_10

ran4 2022. 2. 25. 15:25

 

 

프로그램 오류

컴파일 에러 : 컴파일 했을 때 에러 발생

런타임 에러 : 프로그램을 실행했을 때 에러 발생

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

 

java 런타입 에러

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

예외 : 프로그램 코드에 의해서 수습될 수 있는 미약한 오류

예외는 처리할 수 있음

 

예외처리의 정의와 목적

정의 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

목적 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

 

예외 클래스의 계층구조

 

Object

Throwable

Exception                                   Error

RuntimeException          IOException                  OutOfMemoryError

 

Exception -IOException, ClassNotFoundException

               ㄴRuntimeException - ArithmeticException, ClassCastException,

                 NullPointerException, IndexOutOfBoundsException

 

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

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

 

예외 처리하기 try-catch문

정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

try-catch문에서는 괄호 { }를 생략할 수 없다.

 

try-catch문에서의 흐름

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

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

-일치하는 catch블럭을 찾게되면, catch블럭 내의 문장들을 수행, 

전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다

 

2. try블럭내에서 예외가 발생하지 않는 경우

-catch블럭을 거치지 않고 전체 try-catch문을 빠져나가 수행을 계속한다

 

예외의 발생과 catch 블럭

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

일치하는 catch블럭이 없으면 예외는 처리되지 않는다.

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

 

printStackTrace()와 getMessage()

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

getMessage() 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다

예외 발생시 예외 객체가 생성되고 그 안에 예외 정보가 있음 

 

멀티 catch블럭

내용이 같은 catch블럭을 하나로 합친것이다 (JDK 1.7부터 추가)

멀티 catch블럭에서 사용되는 '|'는 논리연산자가 아니라 기호이다

부모자식 관계에서는 멀티를 사용할 필요없이 ParentException e 만 적으면 된다

//참조변수 e로 멀티 catch블럭에 '|'기호로 연결된 예외 클래스들의 공통분모인

조상 예외 클래스에 선언된 멤버만 사용가능하다.

 

예외 발생시키기

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

Exception e = new Exception

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

throw e;

 

checked 예외, unchecked 예외

checked 예외 : 컴파일러가 예외 처리 여부를 체크(필수) //exception과 자손 try-catch문 필수

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

 

메서드에 예외 선언하기

메서드의 선언부에 키워드 throws를 사용해서 메서드내에서 발생할 수 있는 예외를 적어준다

예외가 여러 개일 경우 쉼표로 구분한다 //void method() throws Exception1, Exception2, --{}

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

*예외를 발생시키는 키워드 throw와 예외를 메서드에 선언할 때 쓰이는 throws를 구별

 

finally 블럭

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

작업이 실패하든 성공하든 마무리 작업은 finally 블럭에 넣는다

try-catch-finally의 순서로 구성

 

자동 자원 반환 try-with-resources문

입출력에 사용되는 클래스 중에서는 사용한 후에 꼭 닫아줘야 하는 것들이 있다

try-with-resources문의 괄호()안에 객체를 생성하는 문장을 넣으면

이 객체는 따로 close()를 호출하지 않아도 자동적으로 호출된다

 

사용자 정의 예외 만들기

직접 예외 클래스를 정의할 수 있다

보통은 Exception과 RuntimeException에서 상속받는다

조상선택, string 매개변수가 있는 생성자 넣기 

 

예외 되던지기

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

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

 

연결된 예외

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

예외 A가 예외 B를 발생시키면, A는 B의 원인 예외가 된다

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

Throwable getCause() 원인 예외를 반환 

'백엔드 > Java의 정석' 카테고리의 다른 글

TIL 정리_12  (0) 2022.02.27
TIL 정리_11  (0) 2022.02.26
TIL 정리_09  (0) 2022.02.24
TIL 정리_08  (0) 2022.02.23
TIL 정리_07  (0) 2022.02.22