예외처리

예외처리

자바 오류 정의

오류(Error) 1. 프로그램 수행시 치명적 상황이 발생한 것

2. 소스상 해결이 불가능한 것을 에러라고 하며, 프로그램이 비정상적으로 종료됨

예외(Exception) 프로그램 오류 중 코드 수정을 통해 수습될 수 있는 오류

오류의 종류

컴파일 에러 소스상의 문법 에러, 오타 -> 소스코드 수정 논리 에러 문법상 문제가 없고, 런타임 에러도 발생하지 않지만 개발자 의도대로 작동하지 않음 -> 소스코드 수정

ex) sc.nextLine(), if문, for문 런타임 에러 입력값이 틀리거나 계산식의 오류로 발생 -> try~catch

ex) 숫자를 입력해야 하는데 문자열 입력, 0으로 나눔 시스템 에러 컴퓨터 오작동으로 인한 에러

예외 처리(try~catch)

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

방법 : 예외상황이 발생된 경우에 처리 로직을 만든다

try{

//반드시 예외 처리를 해야 하는 구문 작성 -- 정상적으로 실행

}catch(처리해야 할 예외 클래스명 참조형 변수명){

//잡은 예외 클래스에 대한 처리 구문 작성 --오류날 때 실행

}finally{

//실행 도중 해당 Exception이 발생을 하던 안하던 반드시 실행해야 하는 구문 작성

-- try, catch 중 하나 실행되고 나서 반드시 실행됨

}

멀티 catch try{

//반드시 예외 처리를 해야 하는 구문 작성

}catch(예외클래스명3 e){

}catch(예외클래스명2 e){

}catch(예외클래스명1 e){

} 이때, catch절의 순서는 상속관계를 따라 작성해야 한다. 후손클래스가 부모클래스보다 먼저 기술되어야 함

FileNotFoundException -> IOException -> Exception

try~with~resource try(반드시 close처리해야하는 객체에 대한 생성 구문){

//예외처리를 해야하는 구문 작성

}catch(처리해야할 예외클래스명 레퍼런스){

//잡은 클래스에 대한 처리 구문 작성

} 자바7에서 추가된 기능으로, finally에서 작성되었던 close()처리를 생략하고 자동으로 close()처리되게 하는 문장

Exception 클래스 상속도

소스코드 상에서 반드시 예외처리 해야되는 Checked Exception

소스코드 상에서 명시적인 처리를 강제하지 않는 Unchecked Exception

RunctimeException 후손클래스

finally 사용 이유

우리가 흔히 APP과 DB를 연결해서 사용하게 되는데 정상적으로 DB서버에 연결하여 사용하고 있었다면 마지막에는 DB서버와의 연결을 끊어주어야 한다. (지속적인 연결은 리소스를 계속 잡고 있기 때문에 연결 제한이 발생할 수 있음)

그런데 여기서 정상적인 처리후에 연결 해제만 코딩 해놓게 된다면 비정상적인 처리(예외)상황에서는 DB연결이 해제 되지 않는 상황이 발생하게 되어 큰 문제가 발생할 수 있게 된다. 그렇기 때문에 finally를 통해서 try경우든 catch 경우에든 DB연결 해제 처리를 하게 되어 DB에 영향을 주지 않도록 설정하는 것이다.

Exception 처리 방법

1. Exception 처리를 호출한 메소드에게 위임

- 메소드 선언시 throws ExceptionName문을 추가하여 호출한 상위 메소드에게 처리를 위임하여 해결한다

- 계속적으로 위임하면 main()까지 위임하게 되고, main()까지 가서도 예외처리가 되지 않는 경우 JVM이 비정상 종료됨

2. Exception을 발생한 곳에서 직접 처리

(1) try~catch

- try~catch문을 이용하여 예외 처리

- try : exception 발생할 가능성이 있는 코드를 try 구문 안에 기술

- catch : try 구문에서 exception 발생시 해당하는 exception에 대한 처리를 기술, 여러개의 exception 처리가 가능하나, exception간의 상속관계를 고려해야 함

- finally : exception 발생 여부에 관계 없이, 꼭 처리해야 하는 logic은 finally안에서 구현한다. 중간에 return문을 만나도 fianlly구문은 실행함. 단, System.exit(0)를 만나면 무조건 프로그램을 종료한다. 주로 java.io, java.sql 패키지 메소드 처리시 이용

(2) throws로 예외 던지기

throws로 넘기고 호출이 되는 부분에서 try~catch 써준다

원칙적으로, 메소드를 호출한 곳에서 예외처리를 해야하므로 메소드를 최초 호출한 main 메소드에서 처리하고 있다

*사용자 정의 예외 생성

Exception 클래스를 상속받아 예외 클래스 작성함

Exception 발생하는 곳에서 throw new MyException()으로 발생

예제1

정상 실행 1을 0으로 나눌때 오류 발생->예외처리 필요 예외처리 후 실행 결과

from http://roqkfgksmsdbstn.tistory.com/139 by ccl(A) rewrite - 2021-12-29 18:27:08