JAVA/정리한 것

[ JAVA ] 예외(Exception) 처리

따갓 2022. 5. 20. 01:30

예외(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는 예외가 발생하든 말든 무조건 실행됨");
		}
	}
}
  • 예외처리 : 프로그램 동작시의 오류를 처리하는 방법
  1. 함수가 호출될 때 오동작 발생한다.
  2. 각종 예외상황은 클래스로 정의된다. ( ex : extends RuntimeException )
  3. 예외상황이 발생되면 해당 예외상황에 해당하는 클래스의 인스턴스를 만들고 그것을 던진다.
  4. 예외 상황이 발생할 수 있는 메서드에 throws 예외( A , B ) 를 명시한다.
  5. 예외상황이 발생할 수 있는 코드 부분을 try 로 감싼다. 
  6. 던져진 예외는 catch되지 않으면 프로그램은 종료된다. (오동작이 발생하면 그에 대한 처리를 하지 않으면 프로그램은 종료 )
  7. 적절히 처리된 오동작은 마치 없었다는 듯이 프로그램은 수행을 계속한다.
  8. 예외가 발생했을 때 그 이하의 코드는 수행하지 않고( catch문은 수행하고 ) 바로 프로그램 종료된다.
  9. 단 catch 이후에 finally 내의 코드는 예외가 발생하든 말든 무조건 실행된다. 

 

 

 

[ 출처 / 참고 ]

https://reakwon.tistory.com/155

'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