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 구문을 사용하여, 필요할 때 예외 객체를 던질 수 있음
'방통대 > 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 |