유난스런 개발 기록

[JAVA] Day-17 _ 예외처리 (Exception) 본문

개념정리/JAVA

[JAVA] Day-17 _ 예외처리 (Exception)

yourhwan 2023. 2. 6. 23:13

day-17

예외처리 (Exception)


예외처리 (Exception) 이란 ? 

  • 예외처리란 말 그대로 예상되는 예외를 지정해주고, 지정한 예외가 발생하면 알맞게 처리해 주는 것을 말한다.
  • 예외는 쉽게 말하자면 error 인데, 에러가 발생하면 프로그램은 작동을 멈추게 된다.
  • 예외 처리를 해준다면 프로그램은 멈추지 않고 정상 작동을 이어간다.

 

사실 예외처리는 수업시간에 따로 편성이 되어있었지만, 계속해서 써왔기 때문에 낯설지 않았다.

자바에서는 java.lang.Exception 클래스를 제공하여 예외처리를 할 수 있도록 해준다.

예외처리를 할 때 꼭 기억해야할 것이 있다.

예외 처리를 하다보면 여러개의 예외처리를 사용할 때가 있는데, 

특히 부모 클래스와 자식 클래스의 익셉션을 처리할 때 오류를 범할 가능성이 높다.

 

쉽게 말하자면, 다중 catch 문을 사용할 때

상위 클래스의 예외처리가 가장 아래에 나와야한다.

만약 상위 클래스의 예외처리가 하위 클래스의 예외보다 상단에 위치하게 된다면,

하위 클래스의 예외처리는 실행되지 않기 때문이다. (예외처리 코드가 순차적으로 실행되기 때문이다.)

이 부분을 유의하면서 예외처리를 하면 큰 문제가 없을 것이다.

 

※ ArrayIndexOutOfBoundsException

배열의 크기가 오버되어지면 발생하는 익셉션이다.

String[] subjectArr = {"자바", "오라클", "JSP"};
		
		try {
			for(int i=0; i<=subjectArr.length; i++) {
				System.out.println(subjectArr[i]);
			}
		} catch(ArrayIndexOutOfBoundsException e) {
				System.out.println(">> 배열의 인덱스 범위가 초과되었습니다. <<");
				// System.out.println(e.getMessage());
				// e.getMessage() 는 오류메시지를 알려주는 것이다.
				
				e.printStackTrace();	//  오류의 위치를 추적하여 알려준다.
		}

 

※ ArithmeticExceptionException

분모에 0 이 들어가는 경우에 발생하는 익셉션

try {
	int num =10;
	for(int i=2; i>=0; i--) {
		System.out.println(num/i);
	}
	} catch(ArithmeticException e) {
		System.out.println(">> 분모에는 0 이 올 수 없습니다. <<");
		// System.out.println(e.getMessage());
		// e.getMessage() 는 오류메시지를 알려주는 것이다.
			
		// e.printStackTrace();	//  오류의 위치를 추적하여 알려준다.
	}

 

해당 코드를 실행하면 처음 i=2 가 for 문에 들어가 실행되고 5라는 값이 출력

이후 i=1 이 들어가고 10이 출력

다음엔 분모가 0이 되고 예외처리가 실행된다.

 

※ ArrayIndexOutOfBoundsException 과 ArithmeticException 을 같이 사용해보기

int[] numArr = {10,20,30};
		
		
for(int i=3; i>=0; i--) {
				
	try {
	int val = numArr[i]/i;	// numArr[3]/3 , 30/2 , 20/1 , 10/0
		System.out.println(val);
	} catch(ArrayIndexOutOfBoundsException e) {
		System.out.println(">> 배열의 인덱스 범위가 초과되었습니다. <<");
	} catch(ArithmeticException e) {
		System.out.println(">> 분모에는 0 이 올 수 없습니다. <<");
		// i가 0이 되어지면 잡아준다.
	}
}

 

e.getMessage()

에러 메시지를 출력할 수 있다.

for(int i=3; i>=0; i--) {
			
	try {
		int val = numArr[i]/i;	// numArr[3]/3 , 30/2 , 20/1 , 10/0
		System.out.println(val);
	} catch(ArrayIndexOutOfBoundsException e) {
         System.out.println("에러메시지 : "+ e.getMessage());
	} catch(ArithmeticException e) {
		System.out.println("에러메시지 : "+ e.getMessage());
	}
}

 

위의 코드는 더욱 간략하게 나타낼 수 있는데, 바로 예외처리를 동시에 해주는 방법이다.

for(int i=3; i>=0; i--) {
			
	try {
		int val = numArr[i]/i;	// numArr[3]/3 , 30/2 , 20/1 , 10/0
		System.out.println(val);
	} catch(ArrayIndexOutOfBoundsException | ArithmeticException e) {
		System.out.println("에러메시지 : "+ e.getMessage());
	} 
  }

 

※ try ~ catch ~ finally

finally는 오류가 발생하든 안하든 무조건적으로 실행하게 해준다.

때문에 무조건 실행해야하는 코드는 finally 에 기술해주면 된다.

String[] str_Arr = {"10", "스물", "30"};
		
int count = 0;
		
for(int i=3; i>=0; i--) {
			
	try {
		int val = Integer.parseInt(str_Arr[i])/i;	// str_Arr[3]/3 , 30/2 , Integer.parseInt(strArr["스물"])/1 , 10/0
		System.out.println(val);
	} catch(ArrayIndexOutOfBoundsException e) {
		System.out.println("배열의 인덱스 번호 "+ e.getMessage()+ "이 존재하지 않습니다.");
	} catch(ArithmeticException e) {
		System.out.println("분모에 0 을 넣을 수 없습니다.");
	} catch(Exception e) {
		System.out.println("에러메시지 : "+ e.getMessage());
	} finally {	
		// finally 는 오류가 발생하든지 또는 오류가 발생하지 않든지 관계 없이 무조건 실행한다.
		// 때문에 무조건 실행해야하는 것들은 finally에 기술해주면 된다. 
		System.out.println(++count + "번 반복함!!\n");
	} 
}

 

예외문은 정말 많이 쓰이는 문법이고, 수업시간에도 많이 써왔어서

크게 어려운 부분은 없었다.

예외처리를 정리하면서 느낀 점은

에러 발생으로인한 프로그램의 중단을 막는 역할도 중요하지만

개발자가 의도적으로 다양한 상황에서 사용할 줄 알아야 예외처리의 진가가 나타나지 않을까...