예외(Exception)
- 에러의 종류는 우리가 컴파일할때 발생할 수 있는 컴파일 오류( 대체로 문법상의 에러 ) 와 실행 중 발생되는 런타임 오류( 대체로 코드 설계상 논리적으로 발생하는 에러 ) 두 종류가 있다. 자바에서는 런타임 오류를 에러(Error)와 예외(Exception) 두 종류로 나눈다.
- 에러는 프로그램이 코드로 복구될 수 없는 오류를 의미한다. 예를 들어 메모리가 부족한 경우 프로그래머가 직접 제어할 수 없으므로 이런 경우는 메모리 부족(OutOfMemoryError) 에러가 발생하고 함수 호출이 많아 스택이 쌓일 경우에는 StackOverFlowError가 발생할 수 있다.
- 예외는 프로그래머가 직접 예측하여 막을 수 있는 처리가능한 오류라고 보면 된다. 예외는 Compile시에 발견할 수 있는 예외와 프로그램 실행시에 발생하는 예외 두 종류가 있다.
- Compile시에 발견할 수 있는 예외는 Eclipse와 같은 IDE를 쓴다면 코드 아래에 빨간 줄이 생기면서 예외처리를 해달라는 문구가 뜬다. Compile시 발견하지 못하는 예외는 프로그래머가 예측하여 처리해주어야 한다.
- 이때 예외가 발생했을때 어떤 동작을 처리해야하는지를 우리는 "예외 처리"라고 한다.
[ CASE : try ~ catch 문 이용해서 예외처리 하기 ]
class A extends Exception{} //(2)예외상황
class B extends Exception{} //예외상황
class Test{
public void AorB( int f ) throws A , B{ // A , B 예외 발생할 수 있는 곳
System.out.println("A B 둘중 하나 발생할 수 있음");
double rand = Math.random();
if( rand < 0.3 && f < 7 ){ //(3) 상황에 따라서 확률적으로 예외상황발생
throw new A();
}
else if ( rand < 0.5 && f < 5 ){
throw new B();
}
System.out.println("A 또는 B가 발생하면 이 문장은 출력되지않습니다.");
}
}
public class Main{
public static void main( String[] args ){
Test t = new Test();
try{
t.AorB( 4 ); // A, B 발생가능성 있음.
}
catch( A e ){
System.out.println( e.getClass().getName() + " 발생" );
}
catch( B e ){
System.out.println( e.toString() + " 발생" );
}
finally {
System.out.println("finally는 예외가 발생하든 말든 무조건 실행됨");
}
}
}
- 예외처리 : 프로그램 동작시의 오류를 처리하는 방법
- 함수가 호출될 때 오동작 발생한다.
- 각종 예외상황은 클래스로 정의된다. ( ex : extends RuntimeException )
- 예외상황이 발생되면 해당 예외상황에 해당하는 클래스의 인스턴스를 만들고 그것을 던진다.
- 예외 상황이 발생할 수 있는 메서드에 throws 예외( A , B ) 를 명시한다.
- 예외상황이 발생할 수 있는 코드 부분을 try 로 감싼다.
- 던져진 예외는 catch되지 않으면 프로그램은 종료된다. (오동작이 발생하면 그에 대한 처리를 하지 않으면 프로그램은 종료 )
- 적절히 처리된 오동작은 마치 없었다는 듯이 프로그램은 수행을 계속한다.
- 예외가 발생했을 때 그 이하의 코드는 수행하지 않고( catch문은 수행하고 ) 바로 프로그램 종료된다.
- 단 catch 이후에 finally 내의 코드는 예외가 발생하든 말든 무조건 실행된다.
[ 출처 / 참고 ]
'JAVA > 정리한 것' 카테고리의 다른 글
| [ JAVA ] 소켓 통신 (0) | 2022.05.21 |
|---|---|
| [ JAVA ] 어노테이션( Annotation ) (0) | 2022.05.19 |
| [ JAVA ] class.forName() (0) | 2022.05.18 |
| [ JAVA ] 정적( Static ) (0) | 2022.05.16 |
| [ JAVA ] 익명 클래스 ( Anonymous Class ) (0) | 2022.05.16 |