[java] 컴파일러 오류가없는 여러 개의 return 문


3 Answers

이것에 대해서는, 「Java 언어 스펙」으로 설명합니다.

§14.17

finally 절이 갑자기 완료되면 return 문에서 시작된 제어 전송이 중단 될 수 있습니다.

§14.20.2

try 블록의 실행이 정상적으로 완료되면 finally 블록이 실행되고 다음과 같은 선택 사항이 있습니다.

  • finally 블록이 정상적으로 완료되면 try 문은 정상적으로 완료됩니다.
  • finally 블록이 이유 S로 인해 갑자기 완료되면 try 문은 이유 S로 인해 갑자기 완료됩니다.

try 블록의 실행이 다른 이유로 R에서 갑자기 완료되면 finally 블록이 실행되고 다음과 같은 선택 사항이 있습니다.

  • finally 블록이 정상적으로 완료되면 try 문은 이유 R에 따라 갑자기 완료됩니다.
  • finally 블록이 이유 S로 인해 갑자기 완료되면 try 문은 이유 S (이유 R이 삭제됨)에 따라 갑자기 완료됩니다.
Question

이것은 인터뷰 질문이었습니다.

public class Demo {

    public static void main(String[] args) {
        System.out.println(foo());
    }

    static String foo() {
        try {
            return "try ...";
        } catch (Exception e) {
            return "catch ...";
        } finally {
            return "finally ..."; //got as result
        }
    }
}

내 질문은 컴파일 시간 오류가없는 이유입니다. finally 블록에 return 문이 있으면 trycatch 블록 대신 finally 에서 반환하도록 바인딩됩니다. -Xlint 옵션을 사용하여이 코드를 컴파일하려고 시도했지만 경고를 표시합니다.

warning: [finally] finally clause cannot complete normally



다음을 실행 해보십시오 :

그것은 인쇄 할 것입니다 : 1, 2, 3 그리고 나서 0으로 나눗셈을 던져 예외

public class Demo {
  public static void main(String[] args) {
    System.out.println(foo());
  }
  public static String print(int a){
    System.out.println(a);
    return String.valueOf(a/0);
  }
  static String foo() {
    try {
      return print(1);
    } catch (Exception e) {
      return print(2);
    } finally {
      return  print(3);
    }
  }
}



try, catch 및 finally 블록에 return 문이 하나만 있기 때문에 코드가 올바르게 작동합니다. try, catch 또는 finally 블록 중 하나에 도달 할 수없는 return 문이 있음을 나타내는 두 개의 return 문을 작성하려고하면 컴파일 오류가 발생합니다.




기본적으로 다음과 같습니다.

public boolean someMethod(){
        if(1 == 1){
            return true;
        }
        return false;
}

경고를 표시하지만 컴파일 오류는 발생하지 않습니다. 컴파일러는 return 문이 실행 되지 않을 때만 오류를 발생시킵니다.




Related