today_is

[ exception ] 예외 처리 본문

java

[ exception ] 예외 처리

ye_rang 2023. 12. 3. 15:14

오늘의 목표 >> 

코드 내에 발생하는 다양한 예외를 처리할 수 있는 방법에 대해서 알아보자 !

 

 


 

예외란, 코드 수정에 따라 회피 혹은 처리할 수 있는 문제상황을 말한다.

》 예외와 에러는 다른 개념 

 

 

Exception  : 자바 프로그램 실행 시 발생하는 예외를 규정하는 클래스  ( java.lang.Exception)

 

예를 들어, DB에 접속하여 데이터를 불러오고, 화면에 출력하는 프로그램을 이용한다고 가정하자.

 

만약 DB 접속이 실행되지 않으면 코드 역시도 실행이 되지 않는다. 


이러한 예외를 처리하지않으면 프로그램은 에러를 일으키고 정상 종료 할 수 없게 된다.

 


 

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("프로그램 종료");
	}
}

 


study_review >>

오늘은 예외처리의 중요성에 대해서 배울 수 있었다.

코드를 작성하는 사람이 에러에 대해서 알아야하는 것도 중요하지만,

이 프로그램을 사용하는 사용자에게 왜 에러가 생기는지  알려주는 것이 더 중요하다

 

그러기 위해서는 코드를 실행하면서 생기는 에러에 대해서 예외를 처리해주어야 한다.

try~ catch 를 사용하는 방법만 이해하고 있었는데,

그보다 간단하게 if ~ else로도 메시지를 띄워서 사용자에게 에러사항에 대해 알리는 방법도 있음을 깨닫게 되었다. 

'java' 카테고리의 다른 글

DAO 와 DTO (template 이용 X) - 2  (0) 2023.12.05
DAO 와 DTO (template 이용) - 1  (0) 2023.12.03
[ function ]  (0) 2023.12.01
[ for ] 별찍기 - 심화  (0) 2023.12.01
[ for ] 별찍기  (0) 2023.11.30