예외 처리: 에러 발생시 어떻게 처리할 것인가?
정의: 사전에 예상되는 에러에 대비하는 코드를 작성하는 것
목적: 비정상 종료의 방지를 통한 정상 실행상태 유지→견고한 프로그램
에러 종류
1)수정 불가능한 에러(Error): 프로그래머가 소스상에서 수정할 수 없는 에러 (ex. 메모리 부족, 이클립스 에러)
→처리 불가(재부팅, 주석 처리)
2)수정가능 에러(Exception): 가벼운 에러(ex. ID 중복체크, 파일 입출력(경로명), 서버(IP), 오라클(오라클 주소, SQL) 등)
→예외처리 가능. 이제부터 말하는 예외처리상 에러는 2)를 의미함.
1)컴파일 에러: 컴파일시 에러(문법상의 에러)
2)실행시 에러: 실행시 발생(사용자 입력 오류)
3)논리적 에러: 실행은 되지만 동작이 다르게(프로그램의 순서가 틀린 경우)
예외처리 계층구조
:상위구조일수록 catch절 중 나중에 써야함(∵순차적으로 처리하기 때문)
Object(최상위 클래스)
│
Throwable
┌──────┴──────┐
Error Exception
┌──────┴──────┐
CheckedException RuntimeException(실행시 에러: 생략가능)
│
RuntimeException 하위 예외
CheckException: 반드시 예외처리 필요 | UncheckException: 생략 가능, 필요한 경우에만 예외처리 |
사용자 실수 등 외적 요인에 의해 발생 |
프로그래머의 실수로 발생하는 예외(Runtime Exception) |
IOException(입출력) InterruptedException(쓰레드) MalformedURLExeption(URL) SQLException(DB) ClassFoundException(클래스 이름 잘못 기재) DataFormatException 등 |
RuntimeException 하위 예외 - ArithmeticException(산술연산 오류) - NullPointerException(클래스 저장 안됐을 때) - ArrayIndexOutOfBoundsException(배열 범위 오류) - NumberFormatException(정수 변환시) - ClassCastException(형변환 오류시) - IllegalArgumentException - IndexOutOfBoundException - SystemException 등 |
예외처리 방법
예외처리 종류 |
try~catch(~finally) (예외 복구) |
throws (예외 회피) |
임의발생 (throw) |
사용자 정의 (throw, extends Exception) |
용도 | 프로그래머가 예외발생 시 직접 처리 목적: 디버깅(에러확인→소스변경) |
간접 처리(시스템 내 처리) |
테스트용 | 라이브러리에서 지원 X |
예시 | try{ //실행할 코드 int[] arr=new int [2]; arr[0]=문자열→정수 arr[2]=문자열→정수 int res=arr[0]/arr[1]; System.out.println(res); } //에러 발생시 처리 catch(정수입력 안된경우){} catch(배열범위 초과한 경우){} catch(0으로 나눈 경우){} finally{} 무조건 수행하는 문장 (: 생략 가능. 단, 네트워크/DB 프로그램 에는 서버 연결해제를 위해 반드시 존재 →디도스) |
- 에러 예측을 가능하게 해서 프로그래머가 각자 프로그램에 맞게 예외처리하도록 유도 →API(Java, 라이브러리) 형식) 메소드() throws 예측한 예외클래스 등록(여러개일 경우 콤마로 구분, 순서상관X) public void display() throws Exception, ArrayIndexOutOfBoundsException{ } 예외처리는 호출하는 메소드에서 처리 |
***try~catch의 부분처리(for문 사용)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
package com.sist.exception;
//부분처리
public class MainClass{
public static void main(String[] args){
try{
for(int i=1; i<=10; i++){
try{
System.out.println("i="+i);
int a=i/(int)(Math.random()*3);
System.out.println("a="+a);
} catch(Exception e){
System.out.println("for문 i++로 이동");
}
}
} catch(Exception ex){
ex.printStackTrace(); System.out.println(ex.getMessage());
}
System.out.println("프로그램 정상 종료");
}
}
|
cs |
- 예외 발생시 예외와 일치하는 catch블럭을 찾음
→찾게되면 catch블럭 내 문장 수행하고 try~catch문을 빠져나가 다음 문장 수행
→못찾으면 예외처리 실패
- 예외 발생하지 않으면 try블럭 내 문장 수행 후 try~catch문을 빠져나가 다음 문장 수행
- catch절 예외메세지 코드
printStackTrace() : 예외가 발생한 line 번호 출력
getMessage(): 예외가 발생한 이유를 알려줌.
ex) 숫자를 0으로 나눈경우 => /zero
***catch절이 많을 경우: 같은 계층을 |(or)로 묶거나 상위 개념으로 한꺼번에 처리 가능(멀티 catch블럭)
ex1. catch(ArithemeticException | ArrayIndexOutOfBoundsException e){}
ex2. catch(exception e){}
***예외처리 생략이 가능(조건문으로 주로 처리), 특수한 경우(조건문 처리 어려운 경우) 예외처리 사용
int a=10; if(b==0) System.out.println("0으로 나눌 수 없다") else System.out.println(a/b) |
↔ 호환가능 |
try{ int a=10; int b=0; System.out.println(a/b); } catch(Exception ex){ System.out.println("0으로 나눌 수 없다"); } |
'Java > Java 이론 정리' 카테고리의 다른 글
[Java] 30일차: java.util / collection framework (0) | 2020.07.24 |
---|---|
[Java] 28~29일차: java.lang (1) | 2020.07.22 |
[Java] 21~22일차: 객체지향 3대요소_캡슐화, 상속, 다형성 (0) | 2020.07.13 |
[Java] 18~20, 23~25일차: 클래스_변수, 생성자, 오버로딩, 추상클래스, 인터페이스 (0) | 2020.07.08 |
[Java] 16~17일차: 메소드 (0) | 2020.07.06 |
댓글