두 정수를 입력받고 그 합을 도출하고자 한다.
그런데 만약 입력하는 사람이 정수가 아닌 문자열을 입력한다면 오류가 발생하게 된다.
이때 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(); // 스캐너 닫음
}
}
'Java' 카테고리의 다른 글
기본자료형(primitive)과 Wrapper 클래스 (0) | 2022.06.09 |
---|---|
스캐너(Scanner)를 통해 학생의 성적정보를 처리하는 기능 구현하기 (0) | 2022.06.07 |
스캐너(Scanner) (0) | 2022.06.06 |
연산자(Operator) 7. 비교 연산자 8. 할당 연산자 9. 삼항 연산자 (0) | 2022.06.06 |
연산자(Operator) 5. bit 연산자 6. 논리 연산자 (0) | 2022.06.06 |