본문 바로가기
방통대/Java

7-3 예외와 예외처리

by 꿈꾸는 몽나 2024. 4. 5.
728x90

 

1. 예외와 에러

: 에러는 실행 중 발생하는 심각한 오류로 더 이상의 실행이 불가함

: 예외는 경미한 오류로 복구가 가능함

*예외 발생이란 정상적 실행 흐름을 벗어난 예외적 사건이 발생함을 의미

 

-예외 발생과 처리

: 프로그램 실행 중에 예외 상황이 발생하면, 예외처리 코드에 예외 객체를 생성하여 던짐(throw)

: 적당한 예외처리 코드가 있으면, 예외 객체를 잡아(catch) 처리한 뒤, 프로그램은 계속 수행됨

*예외처리 코드가 없으면, 오류 메시지가 출력되면서 프로그램이 즉시 비정상적으로 종료됨

: 예외 객체는 Exception 클래스(또는 하위 클래스)로 표현되며 예외 발생 정보를 가지고 있음

 

 

 

2. 예외 클래스의 계층 구조

: Exception 클래스는 Throwable 클래스의 자식 클래스

*toString(), printStackTrace() 메소드 등을 상속 받음

 

 

 

 

3. 예외처리

: 예외가 발생했을 때 이 상황을 바로잡아 계속 수행하도록 하는 것

: 예외 발생 시, Exception 객체를 생성하고 throw함

* throw new MyException();

* throw된 예외 객체를 예외처리 코드가 catch하여 예외를 처리함

 

-예외 발생과 처리

: checked Exception 예외가 발생할 수 있는 경우, 반드시 명시적인 예외처리가 필요함(예외처리 코드가 없으면 컴파일 오류)

: RuntimeExceiption 예외의 경우, 예외처리를 안 해도 됨

*프로그램을 정확하게 작성하지 않은 경우 발생됨

* ArithmeticException, NullpointException, IndexOutOfBoundsException 등

 

 

 

4. 예외처리 방법

-직접 처리

: 예외가 발생한 곳에서 예외 객체를 잡아서 처리하는 것

: try-catch구문 또는 try-catch-finally구문을 사용하여 예외를 처리함

: 일반 코드와 예외처리 코드가 분리되어 가독성이 좋아짐

 

-간접 처리(예외의 전파)

: 예외 발생 가능성이 있는 문장을 가진 메소드의 선언에서 괄호 다음에 throws 예외클래스를 사용

*해당 메소드는 예외를 발생시킬 수 있는 메소드

: 그 메소드를 호출한 메소드에게 예외처리를 전달 또는 위임하는 것

*호출한 메소드로 '예외를 전파'함

 

 

 

5. 예외의 직접 처리

* try-catch-finally 구문

: 예외 객체를 throw하는 문장 또는 예외 발생 가능성이 있는 메소드의 호출 부분을 try 블록에 둠

: 처리하려는 예외 종류에 따라 catch 블록을 작성

-> catch 블록은 1개의 예외 유형 인자를 가지는 메소드와 유사

-> 여러 예외 유형을 분리해서 처리하려면 catch 블록도 여럿이 됨

: finally 블록은 필요에 따라 작성하며 생략 가능

 

 

* try-catch-finally 구문의 실행

: 실행 중에 예외가 발생하면 try 블록은 즉시 종료되고 catch 블록이 실행됨

: catch 블록이 여럿이면, catch 블록의 매개변수와 예외 클래스를 비교하여 적합한 (발생된 예외 자료형과 일치하거나 상위 유형) 하나만 실행됨

-> 상위와 하위 유형 예외를 처리하는 catch 블록이 모두 있다면, 하위 유형 예외를 처리하는 블록이 먼저 나와야 함

: try 블록에서 예외가 발생하지 않으면 catch 블록은 실행되지 않음

: finally 블록은 예외 발생 여부와 무관하게 항상 실행됨

-> 할당 받아 사용했던 리소스를 반환하기 위해 즉, 리소스를 close()하는 문장을 finally 블록 내에 둠

-> 예: try 블록에서 open() 했던 파일을 close()하는 코드를 finally 블록에 둠

 

 

 

6. 예외처리 프로그램 예

 

 

 

 

7. try-with-resources구문

: 리소스 객체의 선언이 있는 try 블록을 가짐

: 리소스의 유형은 AutoCloseable 인터페이스를 구현한 클래스

*이때 리소스는 사용 후 close() 호출을 통해 반환되어야 함

*파일, 네트워크 연결, 데이터베이스 연결 등 외부 자원을 사용하는 경우 사용함

 

: try-with-resources 구문을 사용하면 리소스의 자동 반환을 보장함

*즉, finally 블록에서 리소스를 close() 하지 않아도 됨

 

ex)

 

 

 

 

8. 예외의 간접 처리

: '예외가 발생할 가능성이 있는 코드를 가진 메소드'를 호출하는 쪽에 예외 처리를 위임하는 것(예외의 전파)

*예외 발생 코드의 예외처리를 위해 try-catch 블록을 사용하지 않고, 대신 메소드 선언부에서 발생시킬 수 있는 예외유형을 표시함

*즉, 메소드 선언에서 괄호 다음에 throws 예외유형을 사용

 

: 메소드 선언에서 throws 절이 표시된 메소드의 호출은 예외 처리가 필요함

 

: 예외를 발생시킬 수 있는 메소드의 예

-> public FileInputStream(String name) throws FileNotFoundException

* FileInputStream 클래스의 생성자

 

-> public int read() throws IOException

* InputStream(또는 Reader) 클래스의 메소드

 

-> 위와 같은 메소드를 호출할 때는 반드시 예외 처리가 필요함

 

 

 

ex1)

 

 

 

ex2)

 

 

 

10. 사용자 정의 예외

: 사용자가 직접 예외 클래스를 작성할 수 있음

: 일반적으로 Exception 클래스를 상속받음

: throw 구문을 사용하여, 필요할 때 예외 객체를 던질 수 있음

 

 

728x90

'방통대 > Java' 카테고리의 다른 글

[Java] 8-1 Object 클래스  (0) 2024.04.12
7강. Java - 패키지와 예외처리 연습 문제  (0) 2024.04.05
7-2 사용자 정의 패키지  (0) 2024.04.05
7-1 패키지  (0) 2024.04.05
6강 - Java 제네릭과 람다식 연습 문제  (0) 2024.03.29