0. 문제[텍스트]
/******************************************************************************
* 문제 3-3
******************************************************************************/
// 새로운 프로젝트와 Main.java 소스파일을 만든 후 [문제 3-2]에서 작성한 소스코드를 복사해서 삽입하라.
// [문제 3-3] 실행 결과를 참고하여 아래 코드를 완성하라.
public class Main
{
public static int[][] makeArray(Scanner s) { 기존 코드와 동일 }
public static void printArray(int arr[][]) { 기존 코드와 동일 }
public static void printArrayElement(Scanner s, int arr[][]) {
int r = 0, c = 0;
"dividen? " 와 "divisor? " 를 출력하고 분자와 분모를 각각 입력 받는다.
분자를 분모로 나눈 몫을 행 변수 r에 저장하고
분자를 분모로 나눈 나머지를 열 변수 c에 저장
arr[r][c] 원소를 출력결과처럼 적절히 출력하고 리턴
위 과정을 처리하는 도중 예외가 발생할 경우 출력결과처럼 에러 원인을 출력하고 리턴
}
public static void main(String[] args) {
Scanner scanner = 스캐너 객체 생성;
int arr[][];
arr = makeArray(scanner);
printArray(arr);
System.out.println();
{ // 아래 과정을 계속 반복 수행한다.
printArrayElement(scanner, arr);
System.out.print("continue? ");
문자열 단어 하나를 입력 받음
System.out.println();
입력된 단어가 "yes"이면 계속 반복 수행하고 "yes"가 아니면 여기서 반복을 중단한다.
}
스캐너 객체 닫기;
System.out.println("Done.");
}
}
1. 문제소개 및 실행예시
2. 전체코드
import java.util.Scanner;
import java.util.InputMismatchException;
public class Main{
public static int[][] makeArray(Scanner s) {
int size = 0;
int tmp = 0;
System.out.print("array size? ");
size = s.nextInt();
int size_tmp = size;
int arr[][] = new int[size][];
for(int i = 0; i<size; i++)
arr[i] = new int[size_tmp--];
for(int i = 0; i< size; i++){
for(int j = 0; j< arr[i].length; j++){
arr[i][j] = tmp+j+i;
}
}
return arr;
}
public static void printArray(int arr[][]) {
int size = arr.length;
for(int i = 0; i< size; i++){
System.out.print("arr["+i+"] ");
for(int j =0; j < arr[i].length; j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
public static void printArrayElement(Scanner s, int arr[][]) {
int r = 0, c = 0;
try{
System.out.print("dividen? ");
int divd = s.nextInt();
System.out.print("divisor? ");
int divs = s.nextInt();
r = divd/divs;
c = divd%divs;
System.out.println("arr["+r+"]["+c+"]: "+arr[r][c]);
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("arr["+r+"]["+c+"]: "+" array index is out of BOUNDS");
}
catch(InputMismatchException e){
System.out.println("input an INTEGER");
s.nextLine();
}
catch(ArithmeticException e){
System.out.println("divisor is ZERO");
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int arr[][];
arr = makeArray(scanner);
printArray(arr);
System.out.println();
while(true){
printArrayElement(scanner, arr);
System.out.print("continue? ");
String s = scanner.next();
System.out.println();
if(s.equals("yes"))
continue;
else
break;
}
scanner.close();
System.out.println("Done.");
}
}
3. 대충설명
printArrayElement 메소드를 만들면 되는 문제였다.
해당 문제는 try~catch문 에 대해 알고 있으면 쉽게 풀 수 있었다.
① try블록 뿐 아니라 catch에서도 접근하기 위해서 try 블록 밖에 선언
② try 안에 있는 내용을 실행하는 도중 에러가 나면 catch문으로 넘어간다.
③ catch문은 선언한 순서대로 실행된다. 즉, 에러가 ArrayIndexOutOfBoundException인지 검사하고 아니라면 InputMismatchException으로 넘어간다.
여기에서 친구들이 어려워 했던 건
> 2 b 를입력했을 때이다.
원하는 실행결과는 아래와 같은데
자꾸 continue? 에서 아무것도 입력하지 안았는데 Done. 이 떠버린다는 것..
이유는 바로 scanner에 b가 제대로 빠지지 않아서 그렇다.
- 사용자가 2 b를 공백으로 구분하여 입력
- Scanner의 Buffer에는 2와 b가 저장
- scanner.nextInt() 메소드에 의해 차례대로 변수에 저장
- int divs = s.nextInt() 코드에서는 b를 int로 읽을 수 없기 때문에 에러가 발생하여 catch문으로 빠지게 된다.
- catch문 중에 InputMismatchException 에러이므로 해당 부분이 실행된 후 해당 메소드는 종료된다. (더 이상 실행할 코드가 없음)
- 그런데 printArrayElement 메소드 다음에 실행되는 부분에서 scanner.next()를 하게되면?
- 아직 빠지지 않은 "b"가 출력이 되어버린다. 그래서 yes와 다르니까 break; 문을 만나 바로 종료되게 된다.
이 부분을 해결하기 위해서는 InputMismatchException 을 처리하는 catch문 쪽에 sc.nextLine()이라고 현재 scanner에 있는 값들을 빼내 주면 해결된다.
'코딩이야기 > 연습문제' 카테고리의 다른 글
[라이브코딩 연습] JAVA 실습문제 4-2 (0) | 2022.11.01 |
---|---|
[라이브코딩 연습] JAVA 실습문제 4-1 (0) | 2022.11.01 |
JAVA 실습문제 3-2 (0) | 2022.10.28 |
JAVA 실습문제 3-1 (0) | 2022.10.28 |