Java

try & catch

에어팟맥스 2022. 6. 7. 21:31

두 정수를 입력받고 그 합을 도출하고자 한다.

그런데 만약 입력하는 사람이 정수가 아닌 문자열을 입력한다면 오류가 발생하게 된다.

이때 try와 catch를 사용하면 오류가 발생했을 때 그 입력받은 값을 던져버리고 주의 문구를 표시하도록 할 수 있다.

try 블록에서 입력받은 것이 정수가 아닌 문자열이어서 InputMismatchException 오류가 발생하게 된다면

catch(InputMismatchException e) 를 통해 이 오류가 발생했을 경우에 입력받은 값을 던져버리고 특정 문구가 나타나게 하도록 할 수 있다.

 

(오늘 배운 내용은 오류가 발생했을 때 그 값을 던지고 값을 새로 받지 않고 끝내버리게 되는 것인데

 추후에 오류가 난 값을 던져버리고 바로 종료하지 않고 받지 못한 값을 다시 받을 수 있게 하는 기능을

 배울 수 있지 않을까 생각한다.)

 

package my.day04.b.scanner;  // 6/7

import java.util.*;

public class Main_Scanner3 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		try {
			System.out.print("1. 첫번째 정수 입력: ");
			int num1 = sc.nextInt(); // 10 ==> 통과
									 // 안녕 (X)
			sc.nextLine(); // 스캐너 비움
			
			System.out.print("2. 두번째 정수 입력: ");
			int num2 = sc.nextInt(); // 20 ==> 통과
									 // 하세요 (X)
			sc.nextLine(); // 스캐너 비움
			
			System.out.println(num1 + "+" + num2 + "=" + (num1 + num2));
			// 10 + 20 = 30
		} catch(InputMismatchException e) { // 오류가 나면 던져버리고 catch & print & close
			System.out.println(">>> (은)는 정수가 아니므로 정수만 입력하세요 <<< ");
		}
		
		sc.close(); // 스캐너 닫음

	}

}

그런데 위의 방식대로 정수를 입력받을 때 int num1 = sc.nextInt(); 를 사용해도 되지만, 그 방법 보다는 아래의 방법을 주로 사용한다고 한다.

 

String inputStr = "";

inputStr = sc.nextLine();

int num1 = Integer.parseInt(inputStr);

 

를 통해 일단 문자열로 입력받은 뒤 Integer.parseInt() 를 사용하여 입력받은 문자열(String)을 숫자(Int)로 변환하는 것이다.

package my.day04.b.scanner;  // 6/7

import java.util.*;

public class Main_Scanner4 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		String inputStr = "";
		
		try {
			System.out.print("1. 첫번째 정수 입력: ");
			inputStr = sc.nextLine(); // "10" // 엔터까지 받아서 스캐너 버퍼 비움
											 // "안녕"
			
			int num1 = Integer.parseInt(inputStr); // 문자열 "10" 을 int 타입인 10으로 변경하기
												   // 문자열 "안녕" 을 int 타입으로 변경하고자 할 때 java.lang.NumberFormatException 에러가 발생
												   // Integer.parseInt(inputStr)는 NumberFormatException 을 던져버리고
												   // catch 에서 받음
			// 10
			
			System.out.print("2. 두번째 정수 입력: ");
			inputStr = sc.nextLine(); // "20"
			
			
			int num2 = Integer.parseInt(inputStr); // 문자열 "20" 을 int 타입인 20으로 변경하기
												   // 문자열 "하세요" 을 int 타입으로 변경하고자 할 때 java.lang.NumberFormatException 에러가 발생
			// 20
			
			System.out.println(num1 + "+" + num2 + "=" + (num1 + num2));
			// 10 + 20 = 30
		} catch(NumberFormatException e) { // java.lang 패키지는 자동적으로 import 되어 있음
			System.out.println(">>> " + inputStr +  "(은)는 정수가 아니므로 정수만 입력하세요 <<< ");
			// ##주의## inputStr 은 지역변수이기 때문에 try 밖으로 빼야 함
			// e.printStackTrace(); 에러 표시
		}
			
		
		sc.close(); // 스캐너 닫음

	}

}