[자바] 예외처리 공부하기

heegon·2025년 7월 8일

JAVA

목록 보기
18/20

예외처리란?

보통 문법적인 오류사항이나 로직 자체의 오류 사항에 대해서는 컴파일러가 사전에 에러 사항을 찾아준다. 하지만 정수 자리에 문자 입력 등 사용자에 의해 발생하는 예외 사항에 대해서는 예외처리를 해주어야 한다. try-catch-finallythrows를 이용해서 예외처리를 해줄 수 있다.


try-catch-fianlly 블록

대표적인 사용방법

  1. 기능 구현 후 테스트 진행
package javaAPI;

import java.util.Scanner;

public class TryCatch {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("사칙연산 계산기");
		int num1 = 0;
		char op = 'a';
		int num2 = 0;
		
		num1 = sc.nextInt();
		op = sc.next().charAt(0);
		num2 = sc.nextInt();
		
		switch(op) {
		case '+':
			System.out.println(num1 + num2);
			break;
		case '-':
			System.out.println(num1 - num2);
			break;
		case '*':
			System.out.println(num1 * num2);
			break;
		case '/':
			System.out.println(num1 / num2);
			break;
		}

	}

}

사칙연산 정상입력 정상작동

  1. 예외사항 발생 (숫자에 문자 입력)
    숫자 자리에 문자 입력
    다음 그림과 같이 콘솔창에 java.util.InputMismatchException 이라는 에러 내용을 출력해준다. 이것을 복붙하여 try-catch문을 작성해준다.

  2. 예외사항 처리 (try-catch 블럭 작성)

package javaAPI;

import java.util.Scanner;

public class TryCatch {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		try {
			System.out.println("사칙연산 계산기");
			int num1 = 0;
			char op = 'a';
			int num2 = 0;
			
			num1 = sc.nextInt();
			op = sc.next().charAt(0);
			num2 = sc.nextInt();
			
			switch(op) {
			case '+':
				System.out.println(num1 + num2);
				break;
			case '-':
				System.out.println(num1 - num2);
				break;
			case '*':
				System.out.println(num1 * num2);
				break;
			case '/':
				System.out.println(num1 / num2);
				break;
			}
		}
		catch(java.util.InputMismatchException e) {
			System.out.println("정수 숫자 자리에 문자가 입력되었습니다.");
		}
		sc.close();

	}

}
  1. 2번과 3번 과정을 반복해주면 됩니다.

ex) 나눗셈에서 0으로 나누는 예외 사항을 처리해 주었습니다.
나눗셈 오류

package javaAPI;

import java.util.Scanner;

public class TryCatch {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		try {
			System.out.println("사칙연산 계산기");
			int num1 = 0;
			char op = 'a';
			int num2 = 0;
			
			num1 = sc.nextInt();
			op = sc.next().charAt(0);
			num2 = sc.nextInt();
			
			switch(op) {
			case '+':
				System.out.println(num1 + num2);
				break;
			case '-':
				System.out.println(num1 - num2);
				break;
			case '*':
				System.out.println(num1 * num2);
				break;
			case '/':
				System.out.println(num1 / num2);
				break;
			}
		}
		catch(java.util.InputMismatchException e) {
			System.out.println("정수 숫자 자리에 문자가 입력되었습니다.");
		}
		catch(java.lang.ArithmeticException e) {
			System.out.println("0으로 다른 수를 나눌 수는 없습니다.");
		}
		
		sc.close();

	}

}
  1. 테스트 과정에서 발견되지 않는 예측 불가능한 다른 예외에 대해서는 (Exception e)로 최종 예외 처리 가능합니다.
package javaAPI;

import java.util.Scanner;

public class TryCatch {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		try {
			System.out.println("사칙연산 계산기");
			int num1 = 0;
			char op = 'a';
			int num2 = 0;
			
			num1 = sc.nextInt();
			op = sc.next().charAt(0);
			num2 = sc.nextInt();
			
			switch(op) {
			case '+':
				System.out.println(num1 + num2);
				break;
			case '-':
				System.out.println(num1 - num2);
				break;
			case '*':
				System.out.println(num1 * num2);
				break;
			case '/':
				System.out.println(num1 / num2);
				break;
			}
		}
		catch(java.util.InputMismatchException e) {
			System.out.println("정수 숫자 자리에 문자가 입력되었습니다.");
		}
		catch(java.lang.ArithmeticException e) {
			System.out.println("0으로 다른 수를 나눌 수는 없습니다.");
		}
		catch(Exception e) {
			System.out.println("문자 입력과 0으로 나누는 것 이외의 예측 못한 예외 사항 발생");
		}
		
		sc.close();

	}

}

throws

메소드 내부에서 예외를 직접 처리하지 않고, 해당 메소드를 호출하는 곳에서 예외처리하는 방법.

throws 예시코드

import java.util.*;

public class TryCatch {

	public void throwsTest() throws InputMismatchException {
		int num1 = 0;
		Scanner sc = new Scanner(System.in);
		num1 = sc.nextInt();
		System.out.println(num1);
		sc.close();
	}
	
	public static void main(String[] args) {
		TryCatch tc = new TryCatch();
		try {
			tc.throwsTest();
		}
		catch(InputMismatchException e) {
			System.out.println("잘못된 입력 타입입니다.");
		}
		
	}

}
profile
❤️

0개의 댓글