반응형
1. ArithmeticException 클래스
: 0으로 나눴을 때 예외 발생
// ArithmeticException
// 사용자에게 정수값 2개를 입력받아 나눗셈 출력하기
public void arith() {
Scanner sc = new Scanner(System.in); // 스캐너로 입력받기
System.out.println("num1: ");
int num1 = sc.nextInt(); // 첫 번째 정수 num1
System.out.println("num2: ");
int num2 = sc.nextInt(); // 두 번째 정수 num2
// 조건문(if문)으로 처리하기 <- 처음부터 예외가 발생하지 않도록.
if(num2 != 0) { // 나누는 수 num2가 0이 아닐 때엔 나눗셈값 출력
System.out.println(num1 / num2);
} else { // num2가 0일 때엔 0으로 나눌 수 없다고 출력
System.out.println("0으로 나눌 수 없음");
}
System.out.println("프로그램을 종료합니다.");
// try ~ catch문으로도 처리해보기
try { // (num1/num2)값을 출력한다.
System.out.println(num1 / num2);
}
// num2가 0일 때 발생하는 예외 ArithmeticException
catch(ArithmeticException e) { // 대개 예외처리변수는 'e'로 한다.
System.out.println("0으로 나눌 수 없음");
e.printStackTrace(); // 예외 발생한 곳 추적
}
System.out.println("프로그램을 종료합니다.");
}
2. 다중 catch 블록
: catch를 하려는 예외가 여러 개일 때 사용한다.
이때, 범위가 좁은 예외 자식클래스부터 작성해야 한다. 왜냐하면 예외처리 자식 클래스들은 다형성이 적용되므로
넓은 범위의 예외 클래스(부모 클래스)가 맨위에 오면 부모 클래스가 모든 예외를 처리해버려서 자식 클래스는
실행할 수 없기 때문이다.
// 다중 catch 블록
// 사용자에게 정수값을 입력받아 나눗셈값 출력하기
public void doubleCatch() {
Scanner sc = new Scanner(System.in);
System.out.println("0을 제외한 정수를 입력하세요. ");
try {
int num = sc.nextInt(); // 입력값 num
System.out.println(100 / num); //
} catch(InputMismatchException e) { // 정수가 아닌 다른 타입의 값이 입력됐을 때 발생하는 예외
System.out.println("정수만 입력하세요.");
e.printStackTrace(); // 예외 발생 추적
} catch(ArithmeticException e) { // 입력값이 0일 때
System.out.println("0으로 나눌 수 없습니다.");
e.printStackTrace(); // 예외 발생 추적
}
System.out.println("프로그램을 종료합니다.");
}
3. 배열을 활용한 예외 처리
// 사용자에게 배열의 크기를 입력받아 배열을 만들기
// 50번 인덱스값을 출력하기
public void array() {
Scanner sc = new Scanner(System.in);
System.out.println("음수를 제외한 배열의 크기를 입력하세요. ");
try {
int size = sc.nextInt();
int[] arr = new int[size];
System.out.println(arr[50]);
} catch(InputMismatchException e) { // 정수가 아닌 값을 입력했을 때
System.out.println("정수를 입력하세요.");
} catch(NegativeArraySizeException e) { // 배열의 크기를 음수로 지정했을 때
System.out.println("배열의 크기는 음수로 지정할 수 없습니다.");
} catch(ArrayIndexOutOfBoundsException e) { // 배열의 인덱스 범위를 넘어서 참조했을 때
System.out.println("배열의 크기를 벗어났습니다.");
} catch(RuntimeException e) { // 작성한 예외 이외의 예외가 발생할 경우 모든 예외를 처리
// RuntimeException을 맨위에 작성하면 위의 세 예외 클래스는 실행되지 않는다.
System.out.println("프로그램 실행 시 오류가 발생합니다.");
}
System.out.println("프로그램을 종료합니다.");
}
// 만약 RuntimeException을 맨위에 적어서 한번에 예외 처리되었을 경우
// 타입을 확인해보고 싶다면 instanceof 연산자를 사용하면 된다.
try {
int size = sc.nextInt();
int[] arr = new int[size];
System.out.println(arr[50]);
} catch(RuntimeException e) {
System.out.println("프로그램 실행 시 오류가 발생합니다.");
if(e instanceof InputMismatchException) {
System.out.println("InputMismatchException이 발생하였습니다.");
} else if(e instanceof NegativeArraySizeException) {
System.out.println("NegativeArraySizeException이 발생하였습니다.");
}
System.out.println("프로그램을 종료합니다.");
}
4. NullPointerException 클래스
public void npe() {
String str = null;
try {
System.out.println(str.charAt(0));
} catch(NullPointerException e) { // null인 참조변수로 객체 멤버를 참조하려해 예외 발생
System.out.println("null값이 발생하였습니다.");
}
}
반응형