º Language º/Java

[자바기초] 예외 처리(Exception) 정리노트

Poony 2023. 4. 6. 22:39

* 예외 처리 ?

 

- 예외 : 프로그램 실행 중 사용자의 부주의 등으로 인해 발생하는 예기치 않는 오류 상황을 말합니다.

              즉,  이것을 처리하는 것을 예외처리라고 합니다. 

 

- 자바는 기본적으로 발생할만한 예외들에 대하여 클래스를 만들어 두었습니다.

  그래서 그 상황이 되면 자동으로 예외 객체가 생성됩니다.  우리는 그 이외의 예외 객체를 잡아서 처리해주면 됩니다.

 

 

public void 메소드명(){
 	try{
 		예외가 발생할만한 문장(들)
 	}catch(예외 자료형 변수명){
 		예외처리 시 노출시킬 문장(들)
 	}
 }

> 기본적으로  try{ } catch( ){ }를 활용하여 예외 처리를 합니다.

 

 

 

* 예외 처리 방법 (2가지)

 

 

1. 메소드 안에서 직접 try{ } catch( ){ } 하여 직접 처리하는 방법

 

class DivTest {
	int a = 4;
	int b = 2;
	public static void div(int a, int b) {		
        try{			//메소드 안에서 예외 처리.
		int r = a/b;
        System.out.println(r);
		}catch(Exception e){			
        System.out.println("예외 발생 : "+ e.getMessage());
		}
	}
	public static void main(String[] args) {
		new DivTest();
		
	}
}

> try 안에 예외가 발생할만한 문장을 넣고,  catch 에서 예외 처리 시 노출 시킬 문장들을 작성하여 메소드 안에서 예외를 바로 처리할 수 있습니다.

 

 

 

 

2. 메소드 선언문 (메소드 이름 뒤에) 써주며 예외처리를 메소드 호출쪽으로 throws하여 예외를 전파하는 방법

 

class DivTest {
	public static void div(int a, int b) throws ArithmeticException{
		int r = a/b;
		System.out.println(r);
	}
	public static void main(String[] args) {
		int a = 4;
		int b = 2;
		try{
		div(a,b);
		}catch(Exception e){
			System.out.println("예외 발생 : "+ e.getMessage());
		}
	}
}

> 메소드 선언문에 보면 ArithmeticException 을 throws 하여 메인에 호출 되어 예외처리를 한 것을 확인할 수 있습니다.

> 아래의 .getMessage()는 자동으로 오류 메세지를 나타내주는 메서드입니다.

 

 

 

* 여러 예외 처리 시  처리순서

class DivTest {
	public static void div(int a, int b) {
            try{
            int r = a/b;
            System.out.println(r);
		}catch(ArithmeticException e) {	
       -> 작은 예외 먼저와야 기능을 함.
       
             System.out.println("예외 발생 : "+ e.getMessage());
            }catch(Exception e){			
            -> exception이 높은 클래스 이므로 뒤에와야 함.

            System.out.println("예외 발생 : "+ e.getMessage());
      	  }
		
	}
	public static void main(String[] args) {
		int a = 4;
		int b = 2;
		
	}
}

> 하나의 try 안에 여러가지 catch 절이 올수도 있어요.

이때 범위가 작은 예외종류가 Exception과 같은 큰 예외종류보다 먼저 와야 합니다.

 

 

 

* RunTimeException

 
 - RunTimeException의 후손들은 사용자가 따로 예외처리를 하지 않아도  자바가 알아서 예외처리를 해주기 때문에 컴파일이 됩니다. 그러나 RunTimeException의 후손이 아닌 예외들은 사용자가 반드시 꼭 예외처리를 해주어야 컴파일 됩니다.

 

* 대부분 예외를 포함하고 있는 패키지

 

1. java.io     ->     파일입출력
2. java.net   ->     네트워크통신
3. java.sql   ->      데이터베이스연결

 

 

 

*  finally 
  
  원래 기본적으로 예외가 발생되면 문제가 발생 된 것이기 때문에 해당 catch 절을 수행하고 해당 프로그램이 종료됩니다.
  
  근데 예외가 발생을 하거나 발생하지 않거나 상관없이 모든 상황에서 반드시 동작시켜야 할 명령이 있다면 finally에 써줍니다.
  

 try{
   예외가 발생할 만한 명령(들)
  
  }catch(예외클래스명1 변수명1){
  
  }catch(예외클래스명2 변수명2){
  
  }catch(예외클래스명3 변수명3){
  
  }finally{
  
  }

> finally 기본 코드입니다.

 

 

* 사용자 정의 예외

 

자바는 대부분의 예외에 대하여 이미 클래스가 만들어져 있어요.
그러나 만약 내가 지금 하고 있는 프로그램에서 특정한 상황을 예외로 만들고자 한다면,

 

'사용자 정의 예외' 를 만들 수 있어요.  그 때 사용하는 키워드는 throw입니다.

 class 예외클래스이름 extends Exception{
 	public 예외클래스이름(String msg){
 		super(msg);
 	}
 }
 
try{ 
 if(예외의 상황인가?){
 	throw new 예외클래스명(msg);
 }
 }catch(예외클래스명 변수명){
 
 }

> 사용자 정의 예외를 위한 기본 코드입니다.

  1. 예외처리 클래스를 새로 만듭니다.

  2. 클래스 이름을 예외 클래스 이름으로 지정한 후 extends Exception 하여 상속 받습니다.

  3. 예외 처리를 위해 try catch 를 이용하고, try 안에 if( 사용자 조건) { throw new ~;}를 해주면 됩니다.

 


+ 차이점 짚고가기 !

throws 는 예외처리를 메소드에서 메인 호출로 전파하는 것 < - > throw는 강제로 예외를 발생시키는 것

 

 

ex)  두 수를 입력받아 두 수의 조화평균을 구하는 프로그램을 만들고 싶어요.

조화 평균의 공식 :  2ab/a+b
 만약 ab의 절댓값이 같고 부호만 다르다면 두 수의 조합 평균은 있을 수가  없잖아요?(3+-3=0이 되어어버리니까)

그러나 이 상황은 자바가 알수 없어요.  그렇게 때문에 그 상황을 강제로 사용자 정의 예외 처리를 해야해요.