본문 바로가기
기초 및 언어/▶ Java&JSP

25. 예외 처리(try ~ catch ~ finally), throw, Exception

by 류딩이 2025. 8. 20.

1. 프로그램 에러

⚡ 컴파일 에러 (Compile-time Error)

  • 프로그램을 실행하기 전에 발생
  • 컴파일 시점에서 발생하는 에러
  • 주로 오타, 자료형 불일치, 구문 오류
  • IDE(이클립스, 인텔리제이)에서 빨간 밑줄로 표시되는 경우가 많음
int num = "문자열"; // 자료형 불일치 → 컴파일 에러

 

⚡ 런타임 에러 (Runtime Error)

  • 프로그램 실행 도중에 발생
  • 정상적으로 컴파일은 되지만, 실행 중 예기치 못한 오류 발생
  • 대표적인 예외들:
    • ArrayIndexOutOfBoundsException : 배열 범위를 벗어남
    • NullPointerException : null 객체에 접근
    • ArithmeticException : 0으로 나눔
int[] arr = {1, 2};
System.out.println(arr[3]); // 배열 인덱스 초과 → 런타임 에러

 

2. 예외처리 방법

1) 예외가 발생한 메서드 내에서 직접 처리

try ~ catch ~ finally 구문을 사용

try {
    // 예외 발생 가능성이 있는 코드
    int result = 10 / 0;
} catch(ArithmeticException e) {
    System.out.println("0으로 나눌 수 없습니다.");
} finally {
    System.out.println("예외 발생 여부와 상관없이 무조건 실행됨");
}

 

 

2) 예외를 호출한 메서드로 넘기기

throw / throws 문을 사용

public class Ex02_throw {
	public static void main(String[] args) {
		try {
			call();
			System.out.println("call메서드에서 정상 처리됨");
		}catch(ArithmeticException e) {
			System.out.println("call메서드에서 예외 발생함");
		}
	}


	public static void call() {
		try {
			int result = 3/0; 	// Error :  ArithmeticException
			System.out.println("연산 성공");
			
			// ArithmeticException e = new ArithmeticException
		}catch(ArithmeticException e) {
			System.out.println("연산중 예외 발생");
			throw e;
			// throw : 예외가 발생한 정보를 넘김
		}
	}

}

 

 

3. Exception

: 자바에서 모든 예외 클래스의 최상위 클래스는 Exception 입니다.

 

 

  • 모든 예외의 조상
    • Exception은 예외 계층 구조의 최상위 부모라서, 어떤 예외든 catch(Exception e) 로 잡을 수 있다.
try {
    int result = 10 / 0; // ArithmeticException
} catch (Exception e) { 
    System.out.println("예외 발생: " + e);
}

 

 

 

+ 🌈예외처리를 이용한 숫자맞추기 게임

난수 쉽게 지정하는 방법

 

ex) 32~56사이를 지정할 경우

1. 56-32+1 = 25를 곱한 후,

2. 맨 처음 수인 32를 더하기

//		(int)(0*100) <= d <=(int)(1*100) : 0 ~ 99
//		(int)(0*100)+1 <= d <=(int)(1*100)+1 : 1 ~ 100		


// 32~56 난수 발생 (56-32+1) 
int d2 = (int)(Math.random() *25)+32;

 

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

public class Ex03_Exception {
    public static void main(String[] args) {

        // 1 ~ 100 정수 난수 발생
        int answer = (int)(Math.random() * 100) + 1; 
        Scanner sc = new Scanner(System.in);
        int count = 0; // 시도 횟수 저장
        int num = 0;   // 사용자가 입력한 숫자 저장용

        do {
            count++;
            System.out.print("숫자입력 : ");

            try {
                num = sc.nextInt(); // 정수 입력 받기
                // 문자를 입력하면 InputMismatchException 발생
            } catch (Exception e) {
                System.out.println("⚠ 잘못된 입력! 숫자를 입력하세요.");
                sc.next();   // 잘못 입력된 데이터를 버려 입력 버퍼 비우기
                continue;    // 반복문의 처음으로 이동 → 다시 입력 받기
            }

            // 정답 비교 로직
            if (answer > num) {
                System.out.println("👉 더 큰 수를 입력하세요.");
            } 
            if (num == 444) { // 특별한 종료 조건
                break; 
            }
            else if (answer < num) {
                System.out.println("👉 더 작은 수를 입력하세요.");
            } 
            else {
                System.out.println("🎉 정답입니다!");
                System.out.println("시도한 횟수: " + count + "번");
                break; // 정답이면 반복문 종료
            }
        } while(true);

        // 프로그램 종료 메시지
        System.out.println("프로그램 종료. 정답은: " + answer);
    }
}

 

📌 코드 동작 과정

  1. 정답 생성
    • Math.random()을 이용해 1 ~ 100 사이의 난수를 생성하고 answer 변수에 저장.
  2. 사용자 입력 받기
    • Scanner로 정수를 입력 받음.
    • 만약 문자를 입력하면 InputMismatchException 예외 발생.
  3. 예외 처리
    • try ~ catch 블록으로 예외 처리.
    • 문자가 입력되면 예외가 발생하고,
      catch 블록에서 "잘못된 입력!" 메시지를 출력.
    • sc.next()로 잘못된 입력을 버린 후,
      continue로 반복문 처음으로 이동하여 다시 입력 받음.
  4. 정답 비교
    • 입력 값 < 정답 → "더 큰 수 입력"
    • 입력 값 > 정답 → "더 작은 수 입력"
    • 입력 값 == 정답 → "정답입니다!" 출력 후 종료
  5. 특수 종료 조건
    • 사용자가 444를 입력하면 정답과 상관없이 프로그램 종료.

 

📌 continue란?

  • continue는 반복문 안에서 실행되면,
    해당 반복의 남은 부분을 건너뛰고, 반복문의 처음으로 이동합니다.
  • 이 코드에서는 잘못된 입력을 했을 때:
sc.next();   // 잘못 입력한 데이터를 버림
continue;    // 반복문 처음으로 이동 → 다시 입력 받기

 

 

 

'기초 및 언어 > ▶ Java&JSP' 카테고리의 다른 글

27. 패키지 - String  (3) 2025.08.22
26. 패키지 - Object  (0) 2025.08.22
24. 익명클래스  (3) 2025.08.20
23. 추상클래스, 인터페이스  (5) 2025.08.20
22. import  (0) 2025.08.20