Loading...

JAVA / / 2022. 1. 28. 17:16

자바 36강. 예외 처리

반응형

try-catch

 

오류가 발생하면 프로그램이 종료된다.

더 이상 큐가 진행이 안 되는 것이다.

 

예외처리를 하는 이유는

큐가 종료되는 것을 막기 위해서이다.

 

사용자로부터 입력을 받을 때,

통신을 할 때는 꼭 트라이캐치를 사용해야 한다.

 

사용자가 요구하는 값을 타입에 맞춰

정확히 입력할 지 믿을 수 없기 때문이다.

 

예외처리는 런타임때 일어나기 때문에

어떤 예외를 처리해야하는지 어렵다.

 

그렇기 때문에 우리는 예외처리의 부모 클래스인 Exception을 걸어준다.

 

정수를 입력해야 하는데 한글을 넣었더니

InputMismatchException이 발생했다.

 

예외를 처리하는 것은 뒤에 문제고

예외가 일어나지 않게 미리 막아놔야 한다.

 

이걸 유효성 검사(Validation Check)라고 한다.

 

가장 중요한 것은 유효성 검사이다.

 


 

package site.metacoding.ex21;

import java.util.InputMismatchException;
import java.util.Scanner;

public class DivideByZero2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // InputMismatchException
        // 통신, 사용자 입력 -> 예외처리!!

            try {
                int x = sc.nextInt();
                int result = x / 0;
                System.out.println("받은 값 : " + x);
                System.out.println("결과 값 : " + result);
            } catch (Exception e) {
                System.out.println("===============");
                System.out.println(e.getMessage());
                System.out.println("===============");

                e.printStackTrace();
            }
    }
}

이런 프로그램에서

x에 정수가 아닌 타입을 입력하면

InputMismatchException이 발생하여

catch로 넘어가 프로그램이 종료된다.

 

만약 종료되지 않고 다시 입력하기 위해서는

어떻게 만들어야할까?

while을 쓸까? for문을 쓸까?

 

while을 써야 하는데 결국 catch로 넘어갈 것이다.

 

이유는 스캐너의 버퍼가 비워지지 않았기 때문이다.

 

package site.metacoding.ex21;

import java.util.InputMismatchException;
import java.util.Scanner;

public class DivideByZero2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // InputMismatchException
        // 통신, 사용자 입력 -> 예외처리!!

        boolean check = true;
        while (check) {

            try {
                int x = sc.nextInt();
                int result = x / 0;
                System.out.println("받은 값 : " + x);
                System.out.println("결과 값 : " + result);
                check = false;
            } catch (Exception e) {
                System.out.println("===============");
                System.out.println(e.getMessage());
                System.out.println("===============");
                e.printStackTrace();
                System.out.println("정수를 다시 입력해주세요.");
                sc.nextLine(); // 버퍼 비워!!
            }
        }
    }
}

버퍼에서 데이터를 읽을 때는 \n까지 읽어 들인다.

\n은 줄 바꿈의 의미이다.

 

하지만 우리는 스캐너로 읽어 들일 때 \n을 입력한 적이 없을 것이다.

\n이 줄 바꿈, 즉 엔터키를 의미하기 때문이다.

 

버퍼는 엔터(\n) 기준으로 비워진다.

 

위의 코드는 while문을 돌려놓고 맞지 않는 타입을 넣으면

catch로 넘어가 다시 입력을 받아야 하는데,

위로 올라가면 x에 있는 버퍼가 비워져있지 않기 때문에

오류가 발생하여 또 catch로 넘어갈 것이다.

 

while문을 정상적으로 돌리기 위해서는

버퍼를 비워주기만 하면 된다.

 

그래서 마지막 줄에 nextLine( )을 사용해

다음 줄로 넘겨주어 버퍼를 비워주었다.

 

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형