JAVA
chapter19 : exception
GAWON
2023. 5. 16. 18:35
1.1 예외 (exception)
- 오류(error)의 일종이며 프로그램이 수행시 또는 컴파일시에 불능 상태를 말한다.
1) 오류 : 에러, 개발자가 손 못대는 수준
2) 예외 : 개발자가 회피 할 수 있는 수준
3) 예외클래스의 계층 구조
Object - Throwable - Exception - RuntimeException
- IOException
- ClassNotFoundException
- ...
- 사용자 정의 예외
4) 모든 예외는 java.lang.Exception 클래스로 처리 할 수 있다.
1.2 예외 처리 형식
★ try {
...
예외가 발생 할 가능성이 있는 구역
...
★ } catch (예외를 받는 매개변수) {
받은 예외를 처리하는 구역
} finally {
예외유무를 떠나 무조건 실행되는 구역
}
1.3 예외 종류
- 일반 예외(Exception) - java.lang.Exception
컴파일 시 발생하는 Exception
- 실행 예외(Runtime Exception) - java.lang.RuntimeException
실행 시 발생하는 Exception
*Exception>RuntimeException
1.4 주로 발생하는 예외
- NullPointerException : 객체 참조가 없는 상태,
즉 null 값을 갖는 객체를 사용하는 경우 예외 발생
- ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과할 경우 예외 발생
- ArithmeticException :정수를 0으로 나눌 경우 예외 발생
- NumberFormatException :주어진 문자열을 정수 및 실수로 변환하지 못할 경우 예외 발생
- ClassCastException :클래스간의 타입 변환을 할 수 없을 경우 예외 발생
Q2. Test02.java
사용자로부터 10이상의 정수를 입력 받아 난수 (0 ~ 9)로 나눈결과를 출력하시오.
위과정을 100번 반복하여 출력하며, 나눌 수없는 경우에는 나눈 결과를 0으로 대신출력한다.
import java.util.Random;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 10 이상의 정수를 입력 받음
int n;
do {
System.out.print("10 이상의 정수를 입력하세요: ");
n = scanner.nextInt();
} while (n < 10);
Random rand = new Random();
for (int i = 1; i <= 100; i++) {
int randNum = rand.nextInt(10); // 0~9 사이의 난수 생성
int result = 0;
if (randNum != 0) { // 0으로 나눌 수 없는 경우에만 나누기 진행
result = n / randNum;
}
System.out.println(i + ": " + result);
}
}
}
Q3. Test03.java
나이를 입력 받아 출력하시오.
나이가 0 ~ 150 사이의 범위를벗어나면 AgeException 클래스를 이용하여 예외를 처리하시오.
나이를 입력 받기 위해 getAge() 메소드를 이용하시오.
import java.util.Scanner;
class AgeException extends Exception {
public AgeException(String message) {
super(message);
}
}
public class Test03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = 0;
try {
age = getAge(scanner);
System.out.println("입력하신 나이는 " + age + "살입니다.");
} catch (AgeException e) {
System.out.println(e.getMessage());
}
}
public static int getAge(Scanner scanner) throws AgeException {
System.out.print("나이를 입력하세요: ");
int age = scanner.nextInt();
if (age < 0 || age > 150) {
throw new AgeException("나이는 0살 이상 150살 이하로 입력해주세요.");
}
return age;
}
}
Q4. Test04.java
주민등록 번호 (하이픈 포함)를 입력 받아 출력하시오.
주민등록번호가 14글자가 아니면 PerIDException 클래스를 이용하여 예외를 처리하시오.
주민등록번호를 입력받기 위해 getPerID() 메소드를 이용하시오.
import java.util.Scanner;
class PerIDException extends Exception {
public PerIDException(String message) {
super(message);
}
}
public class Test04 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String perID = "";
try {
perID = getPerID(scanner);
System.out.println("입력하신 주민등록번호는 " + perID + "입니다.");
} catch (PerIDException e) {
System.out.println(e.getMessage());
}
}
public static String getPerID(Scanner scanner) throws PerIDException {
System.out.print("주민등록번호를 입력하세요: ");
String perID = scanner.nextLine();
if (perID.length() != 14) {
throw new PerIDException("주민등록번호는 14자리로 입력해주세요.");
}
return perID;
}
}
Q5. Test05.java
Up-Down 게임
1 ~ 100 사이의 난수를 발생시켜 해당 값을 맞출때까지 게임을 진행하시오.
다음의 경우 예외를 발생시키시오.
1) 사용자가 1 ~ 100 이외의 값을 입력한 경우 NumberOutOfBoundsException 클래스를 이용하여 예외 처리
2) 정수대신 다른 데이터 (예: 실수, 문자) 등을 입력한 경우
import java.util.InputMismatchException;
import java.util.Random;
import java.util.Scanner;
class NumberOutOfBoundsException extends Exception {
public NumberOutOfBoundsException(String message) {
super(message);
}
}
public class Test05 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int answer = random.nextInt(100) + 1; // 1 ~ 100 사이의 난수 발생
int guess = 0;
while (true) {
System.out.print("1부터 100까지의 숫자 중 하나를 입력하세요: ");
try {
guess = scanner.nextInt();
if (guess < 1 || guess > 100) {
throw new NumberOutOfBoundsException("숫자는 1부터 100까지의 범위 내에서 입력해주세요.");
}
if (guess == answer) {
System.out.println("정답입니다!");
break;
} else if (guess < answer) {
System.out.println("Up!");
} else {
System.out.println("Down!");
}
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.");
scanner.nextLine(); // 입력 버퍼 비우기
} catch (NumberOutOfBoundsException e) {
System.out.println(e.getMessage());
scanner.nextLine(); // 입력 버퍼 비우기
}
}
}
}