Java

[Java] 다시 정리하는 예외

꽃달린감나무 2022. 2. 11. 23:57
728x90
  • 예외 : 프로그램의 논리에 맞지 않는 상황

 

  • 예외처리의 방식 (try~catch)
    - if문을 통해 예외를 처리할 수 있지만, if문은 예외 처리만을 위해 사용되지 않기 때문에, 코드의 가독성이 떨어질 수 있다. 따라서 예외처리문인 try~catch문을 통해 예외를 처리하게 되면 어느 부분이 예외가 발생하는지 예외처리를 어떻게 하는지에 대해 쉽게 파악할 수 있다. try~catch문 구조는 대략 다음과 같다.
	try {
				if(choice < INIT_SELECT.INPUT || choice > INIT_SELECT.EXIT) {
					throw new MenuChoiceException(choice); //예외 발생구간!!!
				}
				switch(choice) {
				case INIT_SELECT.INPUT:
					phone.InputData();
					break;
				case INIT_SELECT.SEARCH:
					phone.searchData();
					break;
				case INIT_SELECT.DELET:
					phone.DeletData();
					break;
				case INIT_SELECT.EXIT:
					System.out.println("프로그램을 종료합니다.");
					return;
					}
              
			}catch(MenuChoiceException e) {
				e.showWrongChoice();
				System.out.println("초기 메뉴선택으로 돌아갑니다.");
			}

 

위 예시는 사용자가 지정된 번호 외의 정수를 입력했을 경우를 처리하는 문으로 보통 try 문에는 일반적인 상황과 예외가 발생하는 상황를 작성하고, catch문에는 예외처리문을 작성하면 된다.

 

  • 그럼 예외가 발생했다는 것을 컴파일러는 어떻게 인식할까?

컴파일러는 보통 ArrayIndexOutOfBoundsException, NullPointrException(참조변수가 null일 때 메소드를 호출하는 상황) 등등의 기본적인 예외 클래스들에 대한 상황은 스스로 인식하십니다. 어떤 예외 클래스가 있는 지 확인하실려면 아래의 링크를 참고 해주세요!

 

https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/Exception.html 

 

Java Platform SE 8

 

docs.oracle.com

하지만 위 예시 코드 처럼 개발자 직접 예외 클래스를 만든 경우에는 컴파일러는 이를 알 수 없습니다. 그래서 예외상황을 알려주기 위해 thorw 명령어를 사용합니다. thorw문은 JVM에게 에외상황이 발생했을 알리는 키워드 입니다.

 

  • throw로 예외를 알렸다면 예외를 어떻게 처리해야할까요?
    1.  try~catch문을 통해 해당 예외를 처리해주면 됩니다.
    2.  예외를 처리하기 싫다면 throws를 통해 예외를 다른 곳에서 처리하도록 예외를 던져버리면 됩니다
	public static String readName() throws NameLengthException {
		
		
		System.out.print("이름을 입력하세요 : ");
		String name = scan.nextLine();
		
		if(name.length() < 2) {
			throw new NameLengthException(name);
		}
		return name;
	}

다음과 같이 해당 메소드 내에서 예외가 생겼다면 이를 throws를 통해 예외를 다른 곳으로 넘기면 됩니다! 하지만 예외상황은 메소드 내에서 처리되지 않으면, 메소드를 호출한 영역에서 예외의 처리가 던져지기 때문에 호출된 영역에서 try ~catch문, 혹은 throws을 통해 예외상황을 처리해야합니다. throws로 여러 번 예외를 던질 수는 있어도 언젠가는 반드시  try ~ catch로 예외처리를 해줘야합니다. 

 

  • 예외 클래스의 계층도

다음은 예외 클래스의 계층도이다.

Error 예외 클래스는 프로그램이 실행이 멈출정도 심각한 오류들을 포함한다. Exception 클래스를 상속받는 클래스들의 대부분은 예외처리를 해줘야한다. 따라서 메소드를 호출할 때마다 API문서를 통해 해당 메소드가 예외를 전달하는지 확인하고 사용해야한다! 예외를 전달한다면, 위에서 설명한 방법과 같이 예외처리를 해주면된다. 하지만 RuntimeException의 경우 아래 예외 클래스들을 가지고 있는데 살펴보면 프로그램이 Error처럼 프로그램이 돌아가지 못하기 때문에(Error와 비슷해 보이지만 Error처럼 심각한 오류를 일으키지는 않는다!)  특별한 경우가 아니면 예외를 따로 처리해주지 않아도 된다.

  •  ArrayIndexOutOfBoundsException(배열 인덱스의 잘못된 인덱스 값을 사용하는 상황)
  •  ClassCastException( 허용하지 않는 형변환 연산)
  •  NullPointerException ( 참조변수가 null이지만 메소드를 호출하는 상황)
  •  NegativeArraySizeException( 배열의 크기를 음수로 선언하는 상황)

 

 

728x90