관리 메뉴

제뉴어리의 모든것

8. 예외처리 [1.10] 본문

JAVA/자바의정석

8. 예외처리 [1.10]

제뉴어리맨 2022. 6. 23. 20:22

1.10 - 사용자 정의 예외 만들기

기존에 존재하는 예외클래스를 그냥 써도 되지만 필요에 따라 개발자가 예외클래스를 만들어서 예외를 던지거나 해서 사용할 수 있다. 

 

  • 예외 만드는법

- 기존에 만들어져 있는 예외 클래스를 상속받아 클래스를 정의한다.

(보통 Exception, 혹은 RuntimeException 클래스를 상속 받아 만든다)

 

import java.util.Scanner;

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

        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        try{
            System.out.println("try문");
            printHelloFunc(name);
        }
/***
 *      아래처럼 Exception을 인자로 하는 catch는 WrongNameException 보다 상위에 있을 수 없고 에러가 발생한다.
 *      instanceof 연산자로 예외클래스를 분기하는데
 *      Exception은 모든 예외클래스의 조상이기 때문에 밑에 오는 catch 구문은 진입이 어차피 불가하기 때문이다.
 */

//        catch (Exception e)
//        {
//            System.out.println("Exception catch문");
//        }
        catch (ArithmeticException e)
        {
            System.out.println("ArithmeticException catch문");
        }
        catch (WrongNameException e)
        {
            System.out.println("WrongNameException catch문");
            System.out.println(e.getMessage()); //Exception 클래스의 생성자를 이용하여 초기화한 메세지 출력
            e.printStackTrace(); //not thread-safe하다
        }

        catch (Exception e)
        {
            System.out.println("Exception catch문");
        }
        finally {
            System.out.println("finally문");
        }
        
        System.out.println("정상종료");
    }

    public static void printHelloFunc(String name) throws WrongNameException { //WrongNameException이 발생 할 수 있다고 선언

        if(name.equals("") || name.equals(null))
        {
            throw new WrongNameException("잘못된 이름"); //임의로 예외 던지기, 메세지를 직접 입력
        }

        System.out.printf("안녕하세요. %s님", name);
     	System.out.println();
    }
}

class WrongNameException extends Exception{
    WrongNameException(String msg) 
    {
        super(msg); //Exception 클래스의 생성자를 이용하여 초기화하면 예외클래스 내에 메세지로써 설정이 가능하다.
    }
}

 

  • 결과 화면 

- 이름을 입력 안 했을 경우

- 이름을 제대로 입력 한 경우

 

참고로 위에 결과화면에서

"- 이름을 입력 안 했을 경우" 에서 console에 출력되는 내용의 순서가 이상하다고 생각할 수 있는데,

이유는 printStackTrace() 메소드가 Thread-safe 하지 않기 때문이다.