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