관리 메뉴

제뉴어리의 모든것

java 예외처리 - throw, throws 본문

JAVA

java 예외처리 - throw, throws

제뉴어리맨 2021. 4. 8. 18:43

자바에서 예외처리를 사용할때 사용하는 throw와 throws를 실습으로 알아보자.

 

결론부터 말하면, 

throw는 프로그래머가 필요에 의해 직접 예외를 던질때 쓰는 키워드.

throws는 예외가 발생됬을 경우 해당 메소드를 호출한 상위로 이 상황을(예외처리)를 전가한다는 키워드이다.

 

아래와 같은 구조의 일반 java 프로젝트가 있다.

프로젝트 구조

  • CustomException : 직접 만든 Exception 클래스
  • main : main 함수를 가진 클래스
  • service : 테스트를 위한 임의의 클래스

아래는 main 클래스의 현재 코드이다.

package exception;

public class main {

    public static void main(String[] args)  {
        service ser = new service();
        System.out.println("main 이전");
        ser.throwTest();
        System.out.println("main 이후");
    }
}

 

아래는 CustomException 클래스

package exception;

public class CustomException extends RuntimeException{

    String code;

    public CustomException(String code) {
        this.code = code;
    }
}

아래는 service 클래스

package exception;

public class service {

    public service() {

    }
    
    public void throwTest() {

        int[] ints = new int[0];

        System.out.println("throwTest 이전");
        if(ints.length  < 1)
        {

        }
        System.out.println("throwTest 이후");
    }
}

 

본인은 보통 위와 같이 어떤 배열에 대하여 크기가 정상적이지 않을 경우 if문을 상황에 맞게 처리를 하였다.

이럴 경우 저 배열이 만약 유저의 정보를 가져온 것이였다고 한다면, 

클라이언트단에서 검증처리가 제대로 이루어지지 않아 들어왔던지 아니면 서버에서 애초에 정상적으로 값을 저장하지 못하여서 가져올때 문제가 생기는 경우일 수가 있다.

두가지 어떤 상황이든 저 if문 안에서는 더이상 무언가 처리를 해줄것이 없고 다만 클라이언트에게 에러를 나타내고 이후 무언가 처리를 방지해야한다.

그리고 그 에러메세지 또한 무언가 프로그래머가 의도한 모습으로 출력이 되어야 할것이다.

만약 그게 웹앱 상황이라면

 

package exception;

public class service {

    public service() {

    }

    public void throwTest() {

        int[] ints = new int[0];
        
        System.out.println("throwTest 이전");
        if(ints.length  < 1)
        {
            throw new CustomException("Too short length"); //추가 코드
        }
        System.out.println("throwTest 이후");
    }
}

위와 같이 일부러 예외를 발생시켜 클라이언트에게 에러 메세지를 나타낼 수 있고 더이상 코드 진행을 안 시킬 수 있다.

그러나 저 경우는 그냥 throw new CustomException("Too short length"); 에서 에러를 내고 프로그램이 뻗어 버릴것이다.

즉, 예외를 발생 시켰을 뿐 예외 처리가 된것이 아니다.

그럴 경우에 throws를 써줄 수 있다.

 

아래와 같이 메소드 옆에 적용할 수 있다.

 public void throwTest() throws Exception

Exception을 쓴것은 모든 예외의 조상격의 클래스이기 때문이다.

그리고 Exception 클래스는 Throwable extends하고 있다.

그러므로 메소드를 호출한 상위에게 에러 메세지를 전가할 수 있도록 해준다.

하지만 저렇게 throws 를 이용하여 호출부분에게 예외를 던지면

메소드를 호출 하는 부분에 에러가 난다. 그 의미는...

해당 메소드는 진행도중 예외 발생시 호출부분에 예외를 던지니까 처리를 해놓으라는것이다.

그래서 아래와 같이 직접 try~catch를 써서 처리를 하든

package exception;

public class main {

    public static void main(String[] args)  {
        service ser = new service();
        System.out.println("main 이전");
        try{                              //추가 코드
            ser.throwTest();
        }
        catch (Exception e)
        {
            
        }
        System.out.println("main 이후");
    }
}

아래와 같이 또 throws로 상위로 예외를 던지면 에러가 나지 않는다.

package exception;

public class main {

    public static void main(String[] args) throws Exception { //throws 추가 코드
        service ser = new service();
        System.out.println("main 이전");
        ser.throwTest();
        System.out.println("main 이후");
    }
}

 

그러나 위와같이 한다면 메인함수보다 더 상위는 없으므로 결국 처음과 똑같이 아무런 처리 없이 예외가 터져 프로그램이 뻗을것이다.

 

이러한 차이와 결과를 참고하여 예외처리를 잘 해보도록하자.

 

 

 

github.com/unool/java_exception.git