본문 바로가기
Java/Java 기초문법

[JAVA 기초] 자바 예외처리 3 - 사용자 정의 예외(user-defined exception) 와 예외처리 연습문제

by dev수니 2021. 4. 12.
반응형

 

 

 1  사용자 정의 예외(user-defined exception)

 

 

 

표준예외 클래스를 사용해도 예외처리를 할 수 업을 경우 직접 예외를 만들어야 한다.

먼저 예외를 만들때 자신의 예외를 checked 로 할 것인지 unchecked 로 할 것인지는 결정해야 한다.

 

API쪽에서 예외를 던졌을 때 사용자쪽에서 그 예외상황을 복구할 수 있다면 checked를 사용한다. 사용자에게 문제를 행결할 기회를 주는 것이면서 예외처리를 강제하는 것이기 때문이다. 하지만 checked를 너무 자주 사용하게 되면 사용자가 힘들다. 때문에 적정선을 찾는 것이 중요하다.

 

사용자가 API 사용방법을 어겨서 발생하는 문제거나 예외가 이미 발생한 시점에서 그냥 프로그램을 종료하는 것이 덜 위험할 때 uncheked를 사용한다.

 

 

 

 

Ex

다음 사용자 정의 예외를 적용한 예제이다.

내가 정의한 클래스를 만들고 Exception 클래스를 상속받아 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package exception;
 
class AgeException extends Exception{
   AgeException() {
        super("나이가 잘못됨.");
    }
}
public class User_Defined_Exception {
    static void ticketing(int age) throws AgeException {
        if(age<=0) {
            AgeException obj = new AgeException();
            throw obj;
        }
            
    }
    public static void main(String[] args) {
        int age = 0;    // 나이를 0, 또는 음수로 입력시 예외 
        try {
            ticketing(age);
        } catch(AgeException e) {
            e.printStackTrace();
        }
    }
}
cs
exception.AgeException: 나이가 잘못됨(마이너스 값).
   at exception.User_Defined_Exception.ticketing(User_Defined_Exception.java:11)
   at exception.User_Defined_Exception.main(User_Defined_Exception.java:19)

 

 

먼저 사용자 정의 예외 클래스를 생성해준다. 줄3에서 클래스를 생성하고 Exception클래스를 상속받은 후 생성자를 통해서 부모클래스의 생성자에 "나이가 잘못됨." 으로 매개변수를 전달한다. 

 

그리고 줄9에서 메서드를 생성하고 매개변수로 int age 를 전달받는다. 그리고 그 메세드의 내부에서 age가 0보다 작거나 같을 경우 사용자 정의 예외클래스의 객체를 생성하여 예외를 발생시킨다. 이 예외를 main()에서 처리해 줄 것이므로 줄9에서 throws 로 예외를 밖으로 던진다.

 

그리고 main에서 int age 를 0으로 설정한 뒤 , 해당 메서드에서 예외를 처리해야 하기 때문에 try catch 문으로 예외처리를 해주었다.

try 문에 ticketing() 메서드를 호출하고 안에 줄17에서 선언해준 age값을 매개변수로 전달하였고, catch 문에서는 try문에서 발생할 AgeException 예외클래스에 대해 예외처리를 해주었다. 따라서 결과가 위와 같이 나왔다.

 

 

 

 

 

 

 

 

 

 2  예외처리 연습문제

 

1. "ArrayIndexOutOfBoundsException"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package exception;
 
public class ArrayIndexOutOfBounds {
 
    public static void main(String[] args) {
        int[] arr = new int[5];
        try {
            arr[7= 3;
        } catch (Exception e) {
            System.out.println("인덱스 값이 허용 범위를 벗어났습니다.");
            e.printStackTrace();
        } finally {
            System.out.println(arr.length);
        }
    }
}
cs
인덱스 값이 허용 범위를 벗어났습니다.
java.lang.ArrayIndexOutOfBoundsException: Index 7 out of bounds for length 5
    at exception.ArrayIndexOutOfBounds.main(ArrayIndexOutOfBounds.java:8)
5

인덱스 길이를 5로 지정해주고  try 문 안에 arr[7] 로 arr에 없는 인덱스값에 접근하려 하였다. 따라서 catch문의 Exception e 가 실행되어 catch문 내의 구문이 실행되었다. 

 

그리고 finally 문으로 인덱스의 길이를 출력하게 하여 예외의 발생과 상관없이 인덱스 길이가 출력되도록 하였다.

 

 

 

 

2. 숫자를 입력받고 그 수를 제곱하여 아래와 같이 출력한다.

숫자입력 : 11(Enter)

결과(제곱) : 121

다시 실행해서, 문자를 입력하면 '예외'가 뜨도록 하여 아래와 같이 메시지를 출력.

숫자입력 : a(Enter)

결과(제곱) : 숫자가 아님!(입력 = "a")

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package exception;
 
import java.util.Scanner;
 
public class NumberFormatException {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("숫자 입력 : ");
        String s = null;
        int num = 0;
        try {
            s = sc.nextLine();
            num = Integer.parseInt(s);
            num *= num;
            System.out.print("결과(제곱) : "+num);
        } catch(Exception e){
            System.out.println("결과(제곱) : 숫자가 아님! (입력 = \""+s+"\")");
        } 
        sc.close();
    }
}
cs

먼저 메인에 스캐너 객체를 생성하고 숫자를 입력받으라는 메세지를 출력한다. 그리고 입력을 저장할 String 타입의 변수 s 와 입력한 s 를 int 형으로 저장할 변수 num를 선언한다.

 

그리고 try 문에서 s 에 문자를 입력받고 num 에 s 를 형변환하여 저장한다. 이 부분을 try 로 묶은 이유는 s 에 문자가 입력될 수 있기 때문이다. s 에 문자가 입력되게 되면 줄13에서 int형으로 형변환 할 때 NumberFormatException 예외가 발생하게 될 것이다.

따라서 이 부분을 try로 묶어주었고, num값을 제곱하는 부분을 줄14에 써줬으며 줄15에 결과를 출력하는 구문을 써주었다.

 

그리고 catch문을 통해 s를 형변환 하는 동안 예외가 발생했을 경우 처리해야 되는 구문을 작성해주었다.

s는 String 타입이기 때문에 입력해준 값이 정확히 담겼으므로 s 로 잘못 입력되었다고 알려준다.

 

 

 

반응형

댓글