Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- oracle
- view
- 필기
- 기초 선택자
- java 기초
- 기본 API
- dql
- 쿠버네티스
- VS Code
- 도커
- 마크다운
- 깃허브
- DB 개요
- ORACLE 기초
- 웹개발 기초
- docker
- 데이터베이스
- docker 소개
- java
- SQL
- github
- mybatis
- DB
- Flutter
- DB 모델링
- 정보처리기사
- 프로그래밍 기초
- MVC 패턴
- DDL
- 쿠버네티스 기본 개념
Archives
- Today
- Total
핑구
10. 예외 처리 본문
📅 2021.08.30 ~ 2021.08.31
프로그램 오류
- 프로그램 오류란 프로그램 수행 시 치명적인 상황이 발생하여 비정상 종료 상황이 발생한 것을 의미한다.
- 오류의 종류
- 컴파일 에러 : 프로그램의 실행을 막는 소스 상의 문법 에러로 소스 구문을 수정하여야 해결 가능하다.
- 런타임 에러 : 프로그램을 실행했을 때 발생하는 에러로 입력 값이 틀렸거나, 배열의 인덱스 범위를 벗어났거나, 계산식의 오류 등으로 인해 발생한다. 주로 if문을 이용해 조건을 구분하여 해결한다.
- 시스템 에러 : 컴퓨터 오작동으로 인한 에러로 소스 구문 수정으로 해결이 불가능하다.
- 오류 해결 방법 : 소스 수정으로 해결이 가능한 에러(런타임 에러, 컴파일 에러)를 예외(Exception)라고 하며, 이와 같이 예측 가능한 에러는 구문을 처리하는 방법인 예외 처리를 통해 해결한다.
예외 클래스 계층 구조
- Exception 클래스와 Error 클래스 모두 Object 클래스의 자손이며, Exception + Error의 최고 조상은 Trowable이다.
모든 예외의 최고 조상은 Exception 클래스이다. - Exception은 반드시 예외 처리를 진행해 주어야 하는 Checked Exception과 예외 처리를 진행하지 않아도 되는 Unchecked Exception으로 나누어진다.
- Unchecked Exception : RuntimeException과 그의 후손을 말한다.
RuntimeException 클래스는 주로 프로그래머의 부주의로 인해 발생하는 오류이며, 예외처리보다는 소스 코드를 수정하여야 하는 경우가 많다. - Checked Exception: RuntimeException 이외의 것들을 말한다.
- Unchecked Exception : RuntimeException과 그의 후손을 말한다.
예외처리
- Exception 확인하기 : 특정 메소드를 사용할 경우 해당 메소드가 에러를 위임하고 있다면 그 에러(예외 클래스)를 받아서 처리해 주어야 해당 메소드의 사용이 가능하다.
메소드가 어떤 Exception을 발생시킬 가능성이 있는지에 대해서는 Java API Document에서 확인이 가능하다. - 예외 처리 방법
- Exception 처리를 나를 호출한 메소드에 위임
메소드 선언 시 throws ExceptionName문을 추가하여 나를 호출한 상위 메소드에게 처리를 위임한다.
계속 처리하지 않고 위임하는 경우 main 메소드까지 위임이 가능하며, 만약 main 메소드에서도 처리가 되지 않는 경우에는 비정상 종료가 일어난다.
throw : 예외를 강제로 발생시키는 예약어로, 예외를 위임하는 throws와는 사용 용도가 다르다. 만약 예외를 강제로 발생시키는 경우에는 해당 메소드에서 직접 처리하지 않고, 상위 메소드로 처리를 위임한다. 직접 처리하여도 에러가 발생하지는 않으나, 필요에 의해 내가 직접 발생시킨 예외이기 때문에 발생시킨 곳에서 처리하면 발생의 의미가 사라진다.
만약 에러를 발생시키는 경우 에러 처리가 최우선이 되기 때문에 에러 아래에 있는 코드는 도달할 수 없는 코드로 실행되지 않는다.public void method() throws Exception { // 호출한 메소드에게 에러 위임 throw new Exception(); // 에러 직접 발생 }
Exception 클래스 내의 printStackTrace() 메소드는 에러 내용 및 발생 위치를 콘솔에 출력해 주는 메소드로 에러가 발생한 것이 아니라, 잡은 에러의 내용을 출력해 주는 것이다.- 정상적으로 에러 처리가 된 경우
- 비정상적으로 종료된 경우
- 정상적으로 에러 처리가 된 경우
- Exception이 발생한 곳에서 직접 처리
try~catch문을 이용하여 예외 처리를 진행한다.
여러 개의 exception 처리가 가능하지만, exception 간의 상속 관계를 고려해야 한다. 부모 클래스일수록 받을 수 있는 객체가 많은데, 만약 부모 클래스 예외를 자식 클래스 예외보다 선행하여 catch로 처리할 경우, 부모 클래스의 catch 구문에서 이미 자식 클래스에 대한 예외 처리까지 모두 이루어지기 때문에 자식 클래스의 catch 구문은 도달할 수 없는 코드가 된다.
- try : exception이 발생할 가능성이 있는 코드를 try 구문 안에 기술한다.
- catch: try 구문에서 exception 발생 시 어떻게 처리할 것인지에 대한 내용을 catch 구문에 기술한다.
- finally : exception이 발생하는 경우에는 예외 처리가 제일 선행되어야 하기 때문에 하단에 작성된 코드가 실행되지 않고 예외 처리 구문으로 넘어간다. 따라서 예외 처리와 관계 없이 꼭 실행하여야 하는 구문을 finally 안에 작성한다. 중간에 return문을 만나도 finally 구문은 실행되지만, System.exit()를 만나는 경우에는 무조건 프로그램이 종료된다.
- Exception 처리를 나를 호출한 메소드에 위임
Exception과 오버라이딩
- 오버라이딩 시 throws하는 Exception의 개수와 상관없이 자식 클래스의 처리 범위가 부모 클래스의 처리 범위보다 좁이야 한다.
- 오버라이딩 시 부모의 처리 범위는 항상 자식의 처리 범위보다 넓어야 하며, 이는 예외 처리에서도 똑같이 적용된다.
사용자 정의 예외
- Exception 클래스를 상속받아 사용자가 직접 예외 클래스를 작성하는 것으로, 사용자 정의 예외를 만드는 경우 Exception이 발생해야 하는 곳에서 throw new 예외클래스명()으로 작성한다.
- 사용자 정의 예외 클래스는 기본 생성자와 매개 변수 생성자 두 가지의 생성자만 가지며, 매개 변수 생성자에서 String을 받아와 super 생성자를 사용해 String 값을 넘겨 주면 사용이 가능하다.
catch()
- 처리해야 하는 예외가 두 개 이상인 경우에는 catch절을 두 개 이상 만들 수 있으나, 해당 catch절들은 상속 관계를 확인한 후 순서를 지정해 주어야 한다.
만약 부모 클래스 예외가 자식 클래스의 예외보다 상단에 있는 경우 자식 클래스의 예외 처리 구문은 도달할 수 없는 코드가 된다. - catch절을 따로 만들어 주지 않고 다음과 같이 현재 catch절에 추가하여 예외를 처리할 수도 있다.
catch(FileNotFoundException | IOException e)
해당 경우 역시 상속 관계가 고려되어야 하는데, 만약 부모 클래스와 자식 클래스를 같이 두는 경우 부모 클래스가 해당 예외를 모두 받을 수 있기 때문에 자식 클래스 부분은 필요 없는 코드가 된다. 따라서 상속 관계에 있는 클래스를 동시에 catch절에 사용하지 않도록 주의가 필요하다.
try~with~resource
- 자바 7에서 추가된 기능으로 finally에서 작성하여야 했던 close 처리를 try문에서 자동으로 가능하게 만든 구문이다.다음과 같이 작성하는 경우 자동으로 close가 처리된다.
try(FileWriter fw = new FileWriter("b_char.txt", true);) {} - 해당 구문에서 마지막 세미콜론은 생략 가능하나, 여러 개의 객체가 있는 경우 구분을 위하여 중간 세미콜론이 존재하여야 한다.
'JAVA 웹 개발 > 1. JAVA' 카테고리의 다른 글
12. 컬렉션 (0) | 2022.05.13 |
---|---|
11. 입출력(IO) (0) | 2022.05.13 |
09. 기본 API (0) | 2022.05.10 |
08. 다형성 (0) | 2022.05.10 |
07. 상속 (0) | 2022.05.10 |