[Java] Exception

2024. 10. 4. 16:10Java

오늘은 코드를 작성하며 발생하는 예외(Exception)들을 처리 하는 방법에 대해 알아볼 것이다.

자바에서 예외(Exception) 처리는 프로그램 실행 중 발생하는 오류를 처리하고,

비정상적으로 종료되는 것을 방지하는 중요한 메커니즘이다.

 

자바에서는 예외가 발생했을때 try, catch, finally, throw 등을 사용하여 회피 또는 처리 할 수 있다.

>> 예외는 에러와 다른 개념인걸 알고 넘어가자.

 


 

Step 1 if ~ else 로 예외 처리하기

문자열을 입력받아서

모든 글자가 0 ~ 9 사이에 포함되는지 판별하는 함수인 isDigit 에 넣는다

 

우선, 예외가 발생하도록 만들기 위해 판별함수가 무조건 false가 나오도록 한다 

 

함수를 호출하고 반환한 값이 false 이기 때문에

main 에서 else 구문이 실행되고 

"잘못된 입력입니다" 라는 문장을 출력하여, 예외에 대한 대처를 처리할 수 있다. 

import java.util.Scanner;

public class Ex01 {
  public static void main(String[] args) {
	
		Scanner sc = new Scanner(System.in);
		int num;
		
		System.out.printf("정수 입력 >>  ");
		
//		num = sc.nextInt();
		String tmp = sc.nextLine();
		
		if(isDigit(tmp)) {
			num = Integer.parseInt(tmp);
			System.out.println("num : " + num);
		}
		else {
			num = -1;
			System.out.println("잘못된 입력입니다. 다시 입력해주세요");
		}
		
		
		sc.close();
		System.out.println("프로그램 종료");
	}
	
    //	판별함수 ) 문자열의 모든 글자가 0에서 9 사이로 구성되었는가? 
	static boolean isDigit(String str) {	
	  boolean flag = false;	
	  for(int i = 0 ; i < str.length(); i++) {		
		char ch = str.charAt(i);
		  if(ch < '0' || '9' < ch) {
			flag = false;
			break;
		  }
		}
		return flag;
	}

}

Step 2 try ~ catch 로 예외 처리하기

package exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Ex02 {
  public static void main(String[] args) {
		
	Scanner sc = new Scanner(System.in);
	int num;
	
	try {	//	try : 예외가 발생하는 코드를 작성하는 곳
		System.out.print("정수 입력 >> ");
		num = sc.nextInt();
		System.out.println("num : " + num);
		
        //	catch : (지정한 타입) 에 대한 예외가 발생하면 해당 코드 실행	
		} catch (InputMismatchException e) {	
			System.out.println("정수를 입력하세요");
			num = -1;
			
			//	어떤 예외가 발생했는지 확인 가능 
			System.out.println(e.toString()); 	//	예외의 형태를 확인 
			System.out.println(e.getMessage()); 		
			e.printStackTrace(); 	//	전체 예외 호출 스택을 확인하고 싶을때 (기본형식)
		
		} finally {	 //  finally : 예외 발생여부와 관계없이 항상 실행되는 프로그램 마무리 코드
			sc.close();
			System.out.println("프로그램 종료");
		}
	}
}

Step 3 별도의 클래스를 만들어 직접 예외 규정하기

package exception;

import java.util.Scanner;


//	Exception 클래스의 서브클래스를 직접 작성하여 내가 규정하는 타입의 예외를 만들고 사용하기 

class MyException extends Exception {	//	예외가 가지는 모든 조건들을 상속 받아서 사용.
	private static final long serialVersionUID = 1L;
	
	@Override	//	오버라이딩하여 내가 원하는 대로 예외에 따른 처리 만들기 
	public String toString() {
		return "범위를 벗어났습니다";
	}
}


public class Ex03 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num;
		while (true) { 
			try {
				System.out.print("정수 입력 >> ");
				num = sc.nextInt();
				if(0 <= num && num <= 100) {
					break;
				}
				MyException e = new MyException();
				throw e;  //  내가 만든 예외 객체를 던진다 (catch 블록이 받을 수 있도록)
                
            		// catch 에서는 try 내부에서 던진 (throw) 예외를 받아서 처리한다
			} catch (MyException e) {	
				System.out.println(e);
				continue;
			}
		}
		sc.close();
		System.out.println("프로그램 종료");
	}
}

 


 

지금까지는 에러에 대한 개념만 있었지만, 예외 처리를 하여

사용자에게 왜 이러한 오류가 발생하였는지 알려주는 것이 중요하다는 것을 알게 되었다.

 

그리고 예외 처리만 잘 해준다면 코드의 유지보수, 그리고 가독성이 더 향상 될 수도 있다는걸 느꼈다.