-
예외 처리(Exception)JAVA 2023. 3. 2. 21:20
예외와 에러
- 예외 : 사용자의 잘못된 조작이나 혹은 개발자의 잘못된 코디으로 인해 발생한 프로그램 오류
- 에러 : 하드웨어의 고장으로 인해 프로그램이 실행되지 않는 문제
- 코딩으로 처리 불가 - 현실 세계에서 예외는 실체를 가지고 있지 않지만 자바에서는 실체를 가지고 있는 객체로 취급한다.
예외의 종류
- 일반 예외(checked exception)
- 컴파일러가 예외 발생 가능성을 미리 검증 - 실행 예외(runtime exception)
- 실행 시에 예외 발생 확인 가능
예외 처리 방법
- 예외 처리
- 예외 발생 시 예외 클래스로 객체를 생성하여 정상 실행을 유지할 수 있도록 처리하는 것
- 예외 처리를 하지 않은 상태에서 예외가 발생하면 예외 발생 시점에 프로그램이 중단된다. - try ~ catch 블럭
a. finally 블럭 : 예외 발생 유무와 상관없이 실행되는 블럭
b. 직접 예외 객체 발생 : throw 사용 (throws와 별개의 키워드)
try {예외 발생 예상되는 코드} catch(예외 객체) {예외 발생 시 처리 과정} finally {마지막으로 실행할 코드}
예외 종류에 따른 처리
- catch 문이 여러 개 있더라도 try에서 예외가 발생하면 해당되지 않는 다른 catch 문은 수행하지 않고 넘어간다.
- 예외 별 catch 문의 순서도 중요하다.
- 위에는 좀 더 구체적인 예외에 대해 작성하고 아래로 갈수록 포괄적인 예외에 대해 작성하는 것이 좋다.
리소스 자동 닫기
- 리소스(resource) : 데이터를 제공하는 객체
- 리소스는 사용 시 열어야(open)하고, 사용이 끝나면 닫아야(close) 한다.
- close를 하지 않으면 불완전한 상태로 남게 되어 다른 프로그램에서 해당 리소스를 사용하지 못할 수 있다. - 리소스 사용 중 예외가 발생하면 프로그램이 중단되므로 close되지 않아 문제가 발생할 수 있다.
- finally에서 close하면 예외와 상관없이 리소스를 안전하게 닫을 수 있다. - try 문의 () 안에 리소스를 여는 코드를 작성하면 자동으로 리소스를 닫아준다.
- close() 가 없어서 finally에서 명시적으로 close() 하는 것을 선호하는 개발자도 있다.
- 리소스 클래스에 AutoCloseable 기능이 있기 떄문
예외 떠넘기기
- 예외가 발생한 메소드에서 예외를 처리하지 않고, 해당 메소드를 호출한 쪽으로 예외를 던지는 기능.
- throws 키워드 사용
리턴타입 메소드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {}- 일반예외에 대해서 예외를 떠넘기면 호출한 쪽에서 예외 처리하라는 경고 메시지가 나타나게 된다.
- Main 메소드에서도 예외를 떠넘길 수 있다.
- 이때는 JVM에서 예외를 받고, 콘솔 창에 예외 정보를 출력한다.
- 사실상 예외 처리를 하지 않은 것과 동일함
사용자 정의 예외
- 개발자가 사용하려는 예외가 표준 라이브러리에 없을 경우 예외를 정의하여 사용 가능하다.
- 일반 예외로 정의할 경우 Exception 클래스를 상속, 실행 예외로 정의할 경우 RuntimeException을 상속하는 클래스를 선언한다.
public class XXXException extends [ Exception | RuntimeException ] {public XXXException() {// 기본 생성자}public XXXException(String message) {super(message) // 예외 메시지를 입력하는 생성자}- 사용자 정의 예외를 발생시키려면 throw 키워드와 함께 예외 객체를 제공하면 된다.
'JAVA' 카테고리의 다른 글
컬렉션 자료구조(Collection Data Structure) (0) 2023.03.02 Java 표준 라이브러리 (0) 2023.03.02 싱글톤(Singleton) 패턴 (0) 2023.03.02 익명 클래스(Anonymous Class) (0) 2023.03.02 인터페이스(Interface) (0) 2023.03.02