본문 바로가기
JAVA

[JAVA] throws를 이용하여 예외 처리

by 정공자씨 2024. 4. 24.

 

 

 

자바 메서드 호출 과정

자바 실행 시 main() 메서드 호출을 시작으로, 메서드가 호출되고 종료되는 과정
  1. 자바 프로그램을 실행하면, main() 메서드가 처음 실행됨
    • 이 때에 JVM은 현재 실행 중인 메서드명인 main()를 메모리의 Stack area(스택 영역)에 저장해줌
  2. main() 메서드에서 m1() 메서드를 호출하여 m1() 메서드를 실행하면, m1 메서드명을 Stack에 저장
  3. m1() 메서드에서 다시 m2() 메서드를 호출하면, m2 메서드명을 Stack에 저장
  4. m2() 메서드의 실행을 완료한 후  m1() 메서드로 복귀하면,  m2 메서드명을 Stack에서 삭제
  5. m1() 메서드의 실행을 완료한 후 main() 메서드로 복귀하면, m1 메서드명을 Stack에서 삭제
  6. 최종적으로 main() 메서드의 실행을 종료하면 모든 메서드명을 Stack에서 삭제함

 

 

 

throws로 예외 처리하기

throws

  • 이러한 메서드의 호출 과정에서 예외가 발생하면, 발생한 예외를 메서드를 호출한 곳으로 넘기는 방법 
[ throws와 throw ]

throws
예외가 발생하면, 발생한 예외를 메서드를 호출한 곳으로 떠넘김

throw
사용자가 명시적으로 예외를 발생시키는 것
throw new 예외클래스생성자();​

 

 

용도

  • try/catch문으로 예외 처리를 하면, 메서드의 기능이 많아지므로 코드가 복잡해질 수 있음
  • 이 때에 throws로 예외 처리를 따로 해줄 수 있으므로, 코드의 가독성을 높임

 

 

throws를 이용한 예외 처리 방법

  • 예외가 발생하면, 그 예외를 메서드를 호출한 곳으로 떠넘겨서 예외를 처리하는 것
  • 최초로 메서드를 호출한 main() 메서드에서 try/catch문으로 예외를 처리해야 함
  • RuntimeException(런타임 예외) 계열의 예외 발생시, throws를 생략할 수 있음
  • 메서드의 코드가 복잡할 경우에, 예외를 호출한 곳으로 예외를 떠넘겨 코드의 가독성을 높일 수 있음

 

 

형식

public 리턴타입 메서드명() throws 예외클래스1, 예외클래스2... {

}
  • throws 키워드 다음에 떠넘기고 싶은 예외 클래스를 콤마(,)를 이용하여 나열
  • 모든 예외를 떠넘기고 싶다면 throws 다음에 최상위 예외 클래스인 Exception을 써주면 됨
public int throwsFunction() throws NumberFormatException, IOException {

}
public int throwsFunction() throws Exception {

}

 

 

 

예제

  • 키보드로 숫자가 아닌 문자열 입력 시에 NumberFormatExcetion이 발생하면
  • 오류가 발생한 메서드에서는 throws 키워드를 이용하여 발생한 에러를 메서드를 호출한 곳으로 떠넘김
메서드의 코드량이 증가하면, 메서드 내에서 try/catch문으로 예외를 처리하는 것보다 예외를 호출한 메서드로 발생한 예외를 떠넘김으로써 일관성있게 처리하는 것이 가독성과 유지관리성을 높일 수 있음

 

public class ThrowsTest {

    // 해당 메서드에서 예외가 발생하면, 이 메서드를 호출한 곳으로 예외를 떠넘김
    public static int inputScore() throws NumberFormatException { // 숫자 아닌 문자열 입력시 오류 발생
        int score = 0;

        Scanner sc = new Scanner(System.in);		
        System.out.println("점수를 입력하세요");		

        String str = sc.nextLine();
        score = Integer.parseInt(str);

        return score;		
    }

    // main() 메서드
    public static void main(String[] args) {
        try {
            int score = inputScore(); 

            System.out.println("입력 점수 : " + score + "점");
        } catch (NumberFormatException e) {
            System.out.println("숫자만 입력 가능합니다");
        }		
        System.out.println("프로그램 종료");
    }
}

 

[ 실행 결과 ]