국비교육/국비교육 복습

day15_exception_Test05 : 예외 처리 - throw를 사용하지 않고 강제로 예외를 발생시키는 방법 (★)

Luver Duck 2022. 8. 15. 20:52

다음 요구사항에 맞게 프로그래밍 하세요

 

● 요구사항

1) 사용자에게 이름, 국어점수, 수학점수, 영어점수를 입력받아 총점과 평균을 구하는 프로그램을 만듭니다.

2) 사용자가 입력을 잘못한 경우 잘못된 입력입니다. 처음부터 다시 진행해주세요. 라는 메세지를 출력하고

    진행중인 프로그램을 종료합니다.

3) 다음 상황에 해당하지 않으면 입력을 잘못한 것으로 간주합니다.

  - 이름은 한글로 2글자 이상 7글자 이하로 작성해야 합니다.

  - 점수는 모두 0점이상 100점 이하의 정수인 경우만 가능합니다.

 

입력이 정상적으로 진행된 경우에는 이름, 총점, 평균을 출력해주세요.

 

메인 메소드

package day15_exception;

import java.util.Scanner;
import java.util.regex.Pattern;

public class Test05 {

	public static void main(String[] args) {

		// 입력 조건에 대한 정규 표현식
		String regexName = "^[가-힣]{2,7}$";
		String regexKorean = "^(0-9|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-9]|100)$";
		String regexMath = "^(0-9|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-9]|100)$";
		String regexEnglish = "^(0-9|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-9]|100)$";

		Scanner sc = new Scanner(System.in);
		
		try {
			// 입력
			System.out.print("이름 : ");
			String name = sc.next();
			System.out.print("국어 점수 : ");
			String korean = sc.next();
			System.out.print("수학 점수 : ");
			String math = sc.next();
			System.out.print("영어 점수 : ");
			String english = sc.next();
			
			// 판정
			boolean nameTF = Pattern.matches(regexName, name);
			boolean scoreTF = Pattern.matches(regexKorean, korean) 
					&& Pattern.matches(regexMath, math) 
					&& Pattern.matches(regexEnglish, english);
			
			// 출력
			if(nameTF && scoreTF) {	// 입력 조건을 만족한다면
				// 총점, 평균
				int sum = Integer.parseInt(korean) 
						+ Integer.parseInt(math) 
						+ Integer.parseInt(english);
				double avg = sum / 3.0;
				
				// 출력
				System.out.println("이름 : " + name);
				System.out.println("총점 : " + sum);
				System.out.println("평균 : " + avg);
			}
			
			else {
				// 의도적으로 error를 만들어서 catch문으로 도달할 수 있도록 한다
				// 1) 정수 1개를 추출한다 (예외를 강제로 일으키기 위함)
				int errorMaker = Integer.parseInt(korean);
				
				// 2) 예외 발생을 위해 추출한 정수를 0으로 나눈다 (강제로 에러 발생 - 0으로 나누기)
				int error = errorMaker / 0;
			}
		}
		
		catch(Exception e) {
			System.err.println("잘못된 입력입니다. 처음부터 다시 진행해주세요");
			System.exit(1);
		}
		
		sc.close();
	}
}

 

** else문에서 0으로 나누는 방법과 같이 강제로 예외를 발생시키기 위해서는 throw를 이용해야 한다

throw new 예외객체;