본문 바로가기

Java/본격 Java 인터페이스

[Java] 예외처리

예외처리(Exception Handling)
 - 예외(Exception) : 컴파일 오류가 아닌 프로그램 실행시 특정한 상황에서의 문제를 의미합니다.
 - 예외는 if문을 이용해서 처리할 수 도 있으나 코드가 복잡해지는 단점이 있습니다.
  메소드들 중에는 예외처리를 반드시 해야만 사용할 수 있는 메소드도 있습니다.
  여기에서의 예외처리는 if문을 이용한 예외처리가 아닌 예외처리 전용 문법을 사용해야 합니다.
 - 예외도 자바에서는 하나의 클래스로 작업됩니다.

 - 모든 예외 클래스는 java.lang.Exception클래스를 상속받아 동작합니다.

- 문법
 try{
  예외가 발생할 것 같은 실행문들;
 }catch(예외 클래스 - try문에서 발생한 예외){
  발생한 특정 예외에 대한 처리;
 }catch(다른 예외 클래스){
다른 예외에 대한 처리;
 }finally{
예외 발생여부와 상관없이 반드시 동작되는 영역
중간에 return이 발생해도 먼저 실행된 후 return되는 영역
 }
try-catch문의 catch절은 필요한 예외의 개수만큼 반복해서 사용할 수 있습니다.
catch절의 예외클래스는 반드시 하위클래스부터 입력해야 합니다. (상위 클래스부터 입력하면 아래에 하위클래스 입력시 오류가 발생합니다.)

.

.

예제

먼저 Exception클래스를 모른다고 하였을 때 if문으로 예외처리를 해보겠습니다.

import java.util.*;

class ExceptionHandleIf
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);
		int[] arr = new int[100];

		for (int i = 0 ; i < 3 ; i++)
		{
			System.out.print("나누어 지는 수 : ");
			int n1 = sc.nextInt();
			System.out.print("나누는 수 : ");
			int n2 = sc.nextInt();
			if (n2 == 0)
			{
				System.out.println("0으로는 나눌 수 없습니다.");
				i--;
				continue;
			}
			System.out.print("저장할 인덱스 번호 : ");
			int idx = sc.nextInt();
			if (idx < 0 || idx > 99)
			{
				System.out.println("0~99 사이의 번호를 입력하세요.");
				i--;
				continue;
			}

			arr[idx] = n1 / n2;
			System.out.println("나눗셈 결과 : " + arr[idx]);
			System.out.println("인덱스 번호 : " + idx);
		}
	}
}

.

.

if문으로 예외처리가 가능하지만 try-catch문을 사용해서도 예외처리가 가능합니다.

.

.

try-catch문 예외처리 예제

import java.util.*;

class ExceptionHandleTry
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);
		int[] arr = new int[100];

		for (int i = 0 ; i < 3 ; i++)
		{
			try
			{
			System.out.print("나누어 지는 수 : ");
			int n1 = sc.nextInt();
			System.out.print("나누는 수 : ");
			int n2 = sc.nextInt();
			System.out.print("저장할 인덱스 번호 : ");
			int idx = sc.nextInt();

			arr[idx] = n1 / n2;
			System.out.println("나눗셈 결과 : " + arr[idx]);
			System.out.println("인덱스 번호 : " + idx);
				
			}catch (ArithmeticException e){
				System.out.println("0으로는 나눌 수 없습니다.");
				i--;
				continue;
			}catch(ArrayIndexOutOfBoundsException e){
				System.out.println("0~99 사이의 번호를 입력하세요.");
				i--;
				continue;
			}catch(Exception e){
				// 모든 종류의 예외를 catch하는 클래스(Exception)
				System.out.println("알 수 없는 오류가 발생하였습니다.");
				System.out.println(e.getMessage());
				// 받아온 예외클래스에 대한 메세지 출력
			}
			
		}
	}
}

try-catch로 좀 더 깔끔하게 정리할 수 있습니다.

.

.

finally 예제

class FinallyTest
{
	public static void main(String[] args) 
	{
		boolean divOK = divider(4, 2);
		if (divOK)	System.out.println("연산 성공");
		else		System.out.println("연산 성공");

		divOK = divider(4, 0);
		if (divOK)	System.out.println("연산 성공");
		else		System.out.println("연산 성공");
	}

	public static boolean divider(int n1, int n2){
		try
		{
			int result = n1 / n2;
			System.out.println("나눗셈 결과 : " + result);
			return true;
		}
		catch (ArithmeticException e)
		{
			System.out.println(e.getMessage());
			return false;
		}finally{
			// try-catch문의 가장 밑에 존재하며, 어떠한 경우에라도 동작되는 영역
			// 도중에 return을 해도 finally영역을 동작한 후 return함
			System.out.println("finally 영역 실행");
		}
	}
}
728x90
반응형