프로그램을 실행하는 중에 문제가 생긴다면 자바는 이것을 어떻게 처리할까?
프로그램이 꺼지게 놔둘까?
아님 사전에 대책을 세워줄까?
프로그램 실행 중에 발생하는 의도치 않는 상황, 즉 문제를 만나게 된다.
예외 발생 하면 프로그램이 실행 도중 비정상적으로 종료된다
이 예외가 발생시점부터는 나머지 코드가 실행되지 않는다
그래서 예외처리를 통해 프로그램을 정상적으로 종료하도록 해야하는데
이때 사용하는 것이 바로 (예외 처리)Exception Handling이라고 한다
자바에서는 잘 짜인 상속계층 구조로 예외 관련 클래스들을 제공한다
예외와 관련된 최상위 클래스는 Throwable이다
하지만 대부분 Throwable을 상속받은 Exception이나 Eror가 주로 사용된다
하지만 Eror는 예외처리 대상으로 보지 않기 때문에 나머지 Exception클래스와
그 하위 클래스가 주요 처리 대상이 된다.
오류(Error)는 메모리가 부족하거나 메서드끼리 호출을 무한 반복하는 것처럼
일단 발생하면 복구하거나 되돌릴 수 없는 심각한 상황을 말한다.
그래서 이 오류에 대한 처리방법은 오류를 발생하는 요인을 찾아서 없애는 디버깅뿐이다
하지만 예외(Exception)는 오류와 비교하면 심각도가 낮으며
프로그램의 정상적인 흐름을 방해하는 상황이다.
1. Compile Checked Exception 계열
컴파일 시점에서 예외 발생 여부를 알수 있음
예외 처리를 하지 않으면 컴파일 에러가 발생한다
ex) SQLException, IOException 등
2. Compile Unchecked Exception계열
컴파일 시점에서는 예외 발생 여부를 알 수 없고, 실행 시점에 알수 있음
예외를 처리하지 않더라도 컴파일 에러 발생하지 않음
RuntimeException 계열
(ArithmeticException, ArrayIndexOutOfBoundsException, NullPointerException 등)
이 두계열의 차이점은 컴파일 시점에 예외 상황에 대한 대비코드(try~ catch)가 있는지
체크하는 여부에 있으며 Checked Exception과 Unchecked Exception으로 불린다
Checked Exception은 예외 상황이 있는데 예외처리 코드가 없을 경우 컴파일 오류가
발생하니 반드시 예외코드 작성을 해야 한다.
예외처리를 위해서는 try~ catch문으로 사용한다
try 블록 내에 예외가 발생할 것으로 예상되는 코드들을 작성하고
catch 블록 내에 특정 예외 발생 시 수행할 동작(예외 처리 코드)을 기술
단, 발생한 예외를 처리할 수 있는 예외 클래스 변수 선언 필요함
예외가 발생해도 예외처리가 되어 있지 않을 경우
intnum=5;
intnum2=0;
System.out.println(num/num2);
나눗셈 두 번째 피연산자가 0이면, ArithmeticException예외 발생함
여기서 비정상적인 종료가 일어난다
ArithmeticException예외는 RuntimeException계열이므로 컴파일 에러가 발생
따라서 코드상에서 예외 감지가 어려우므로 직접 찾아서 예외 처리를 해야 함!!!!!
catch 블록을 해당 예외 갯수만큼 생성하여 각각의 예외클래스를 명시하거나
상위 예외 클래스를 하나 선언하여 한꺼번에 처리 가능
아래 2군데서 예외 발생 가능성이 있는 코드가 있다
intnum=5;intnum2=1;
System.out.println(num/num2);
int[]arr= {1};
System.out.println(arr[1]);
배열 크기가 1이므로 1번 인덱스는 존재하지 않음(0번만 존재)
따라서, ArrayIndexOutOfBoundsException 예외 발생함
만약, ArrayIndexOutOfBoundsException 예외 처리 catch 문이 없으면
또 다시 프로그램은 비정상적으로 종료된다
DriverManager.getConnection("11","admin","224");를 추가하면 또 예외가 발생
이것은 SQLException 예외로 별도의 catch 블록을 사용하여 처리하거나
모든 예외를 하나로 묶을 수 있는 상위클래스인 Exception 타입으로 처리 가능
단 catch블록은 위에서부터 차례대로 실행되므로 처리순서에 주의해야 한다
ArithmeticException보다 상위 타입인RuntimeException은
더 아래쪾의 catch블록에서 처리해야 한다
예외 발생시 전달되는 예외 객체(e)를 사용하여 예외 원인 파악 가능
1. printStackTrace()메서드: 발생 원인, 위치, 메서드 호출 스택까지 모두 파악
2. getMessage(): 예외 발생 원인을 문자열로 리턴.
그래서System.out.println() 출력문이 필요함
1. 상속관계에 있는 예외를 처리하기 위해서는 자식 예외부터
조상으로 예외의 순서로 catch( ){ }을 작성해야 한다
2. catch(ClassNotFounException| FileNotFoundException e ){
'| =or '성격은 비슷하지만 관계없는 것들을 '| '로 묶어서 처리가능.
이것을 멀티 catch라고 한다
try~ catch~ 블록은 추가로 finally블록을 가질 수 있다.
finally블록은 예외 발생 여부와 상관없이 반드시 실행되어야 하는 내용을 작성한다
심지어 중간에 return문이 코드 중간에 있으면 호출한곳으로 가야하는데
try~ catch~ finally구문안에 return문을 만날 때에도 먼저 finally블록을 실행후
return문을 실행하러 간다
finally구문의 주요 목적은 try블록에서 사용한 시스템 자원의 반납처리에 있다.
시스템 자원이란 데이터베이스 접속을 위한 Connection이나 파일 I/O를 위한 Stream등이 있다
이 시스템 자원은 유한해서 반드시 반납되어야 하는데 만약 반납이 안되면
리소스 릭(resource leak)이 발생한다
finally에서 시스템자원을 반납하는 역할을 한다
만약 try블록 내에서 예외 발생시, try블록 내의 나머지 코드는 실행되지 못한다
단, catch블록에서 해당 예외를 찾아 예외처리 코드를 실행한 후
try~catch블록 바깥 코드들은 정상적으로 실행된다
try안의 내용이 정상일 때와 비정상일 때 실행순서가 다르다..
try가 정상일 때는 try구문 실행하고 {}밖으로 나간다
하지만 try가 비정상일 때는 try구문 {}밖으로 나가서 catch구문으로 간다
자원자동 반환을 한다
finally에서 .close을 자동으로 해준다
ㅣ읽느라 수고 많으셨어요~ㅣ
부족한 글을 읽어주셔서 감사드립니다
아직 부족한게 많으니
틀린 곳이 있다면
조언의 말씀 꼭 부탁드립니다!!!!
[자바] MessageFormat 클래스/연결하기/끼워넣기/배열에 사용하기 (0) | 2020.08.21 |
---|---|
[자바] 프로세스와 멀티 Thread(스레드/쓰레드)_메서드/ 상속/인터페이스 /run, start,synchronized (1) | 2020.08.20 |
[자바] 패키지 종류(유틸리티, 입출력, 유저인터페이스GUI패키지)_Date,Random,Math (0) | 2020.08.18 |
[java]util.Date 클래스(자바의 시각과 날짜를 담는 클래스) (0) | 2020.08.16 |
[자바]Calendar클래스/ Time 패키지(달력,시간) _ 자바 쉽게 정리/특정날짜,현재시간 출력/add,set,get (0) | 2020.08.15 |