Java

throw, throws에 대한 정리

재심 2022. 11. 19. 11:43

[throw, throws의 차이]

  • throw: 에러를 고의로 발생시킬 때 사용
  • throws: 자신을 호출한 상위 메소드로 에러 처리의 책임을 전가 시킴.

[throw]

예외를 강제로 발생시킨 후 catch문을 통해 예외를 처리한다.

  public static void main(String[] args) {
    middleMethod();
  }

  private static void middleMethod() {
    myException();
  }

  public static void myException() {
    try{
      throw new Exception();
    }catch (Exception e){
      System.err.println("myException 메서드에 오류 발생!");
    }

  }
  
//실행결과 : myException에서 예외처리 
myException 메서드에 오류 발생!

[throws]

예제1: 메인메서드에서 myException의 예외처리를 하기

  public static void main(String[] args){
    try{
      myException();
    }catch (Exception e){
      e.printStackTrace();
      System.err.println("메인메서드에서 처리를 진행함.");
    }
  }

  //익셉션이 발생한다는 것을 알려주지 않았기 때문에 throws를 명시하지 않으면 오류가 난다.
//throws를 통해 상위 메서드에 처리를 넘겨야 한다.
  public static void myException() throws Exception{
    throw new Exception("myException 메서드에 오류 발생!");
  }
  
  
//실행결과 : 메인메서드에서 예외처리를 진행함. 
java.lang.Exception: myException 메서드에 오류 발생!
	at ThrowExceptionPractice.myException(ThrowExceptionPractice.java:16)
	at ThrowExceptionPractice.main(ThrowExceptionPractice.java:6)
메인메서드에서 처리를 진행함.

예제2: throws를 받는 경우 예외처리를 진행해주기

  public static void main(String[] args){
    middleMethod();
  }

  //여기에서 myException 메서드에서 발생하는 예외를 처리해주고 있어서 메인메서드에서는 오류가 나지 않는다.
  private static void middleMethod() {
    try{
      myException();
    }catch (Exception e){
      e.printStackTrace();
      System.err.println("middleMethod에서 처리를 진행함");
    }
  }

  public static void myException() throws Exception{
    throw new Exception("myException 메서드에 오류 발생!");
  }
  
  //실행결과
java.lang.Exception: myException 메서드에 오류 발생!
	at ThrowExceptionPractice.myException(ThrowExceptionPractice.java:20)
	at ThrowExceptionPractice.middleMethod(ThrowExceptionPractice.java:12)
	at ThrowExceptionPractice.main(ThrowExceptionPractice.java:6)
middleMethod에서 처리를 진행함

예제3: 예외처리의 책임을 계속 상위 메서드에 넘기기

중간 메서드 조차도 처리하지 않고 상위 호출자에게 책임을 넘겨버리니 오류가 발생한다.

  //아무도 책임 지지 않는다.. 
  public static void main(String[] args) throws Exception {
      middleMethod();
  }

  private static void middleMethod() throws Exception {
    myException();
  }

  public static void myException() throws Exception{
    throw new Exception("myException 메서드에 오류 발생!");
  }
  
  //실행결과
  Execution failed for task ':ThrowExceptionPractice.main()'.
> Process 'command '/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

[throw + throws 조합하여 사용]

예외처리를 예외가 발생한 메서드에서도 하고, 호출부에서도 처리를 하고 싶을 때 사용할 수 있다.

myException에서 예외처리 + middleMethod에 던졌는데적절한 처리가 없어서 오류가 난다.

 

  public static void main(String[] args) {
      middleMethod();
  }

  private static void middleMethod() {
    try{
      myException();
    }catch (Exception e){
      System.err.println("middleMethod에서 오류 발생!");
    }
  }

  public static void myException() throws Exception {
    try{
      throw new Exception(); //아래의 catch문에서 처리된다.
    }catch (Exception e){
      System.err.println("myException 메서드에 오류 발생!");
      //throw를 통해 호출메서드에도 예외를 던지게 된다. throws를 함께 명시해주어야 한다.
      throw e;
    }

  }
  
  //실행결과
  myException 메서드에 오류 발생!
  middleMethod에서 오류 발생!

 

[참조]

https://devlog-wjdrbs96.tistory.com/141

 

[Java] throws와 throw의 차이는?

throw와 throws의 차이점 throw : 에러를 고의로 발생시킬 때 사용합니다. throws : 자신을 호출한 상위 메소드로 에러를 던지는 역할을 합니다. throw란? 예제 코드를 먼저 보겠습니다. public class File { publ

devlog-wjdrbs96.tistory.com

https://tlatmsrud.tistory.com/49

 

[Java] 예외처리, Throw, Throws란 / 예외와 에러의 차이 / 예제

1. 개요 스터디로 File 업로드, 다운로드 로직을 작성하던 도중, 특정 부분에 빨간줄이 등장했다. 자연스럽게 마우스 가져가보니 Exception!. 별생각 없이 add thrwos declaration 클릭. 상황종료. 이처럼 예

tlatmsrud.tistory.com