program tip

무한 루프는 컴파일 오류없이 메서드 서명을 중단합니다.

radiobox 2020. 11. 18. 08:52
반응형

무한 루프는 컴파일 오류없이 메서드 서명을 중단합니다.


이 질문에 이미 답변이 있습니다.

컴파일 오류가 발생하지 않고 Java에서 다음 코드가 허용되는 이유가 궁금합니다. 제 생각에이 코드는 String. 누군가 내가 여기서 놓친 것을 설명 할 수 있습니까?

public class Loop {

  private String withoutReturnStatement() {
    while(true) {}
  }

  public static void main(String[] a) {
    new Loop().withoutReturnStatement();
  }
}

}메서드 의 마지막 은 도달 할 수 없습니다. 값을 반환하지 않고 메서드의 끝까지 도달 할 수있는 경우에만 컴파일 오류가 발생합니다.

이것은 예외로 인해 메서드의 끝에 도달 할 수없는 경우에 더 유용합니다.

private String find(int minLength) {
    for (String string : strings) {
        if (string.length() >= minLength) {
            return string;
        }
    }
    throw new SomeExceptionIndicatingTheProblem("...");
}

이에 대한 규칙은 JLS 섹션 8.4.7에 있습니다 .

메서드가 반환 형식 (§8.4.5)을 갖도록 선언 된 경우 메서드 본문이 정상적으로 완료 될 수 있으면 컴파일 타임 오류가 발생합니다 (§14.1).

귀하의 방법은 정상적으로 완료 될 수 없으므로 오류가 없습니다. 중요한 것은 정상적으로 완료 할 수 없다는 것이 아니라 사양이 정상적으로 완료 할 수 없다는 것을 인식 한다는 것입니다. JLS 14.21 부터 :

while다음 중 적어도 하나에 해당하는 IFF에 문이 정상적으로 완료 할 수 있습니다 :

  • while문 도달 상기 조건식은 일정한 값으로 표현 (§15.28) 아니다 true.
  • break문을 종료 하는 도달 가능한 문이 while있습니다.

귀하의 경우 조건식 value 있는 상수 true이고 어떤 break문 (도달 가능 여부)이 없으므로 while문이 정상적으로 완료 될 수 없습니다.


 private String withoutReturnStatement() {
    while(true) {
        // you will never come out from this loop
     } // so there will be no return value needed
    // never reach here ===> compiler not expecting a return value
  }  

더 명확하게하려면 이것을 시도하십시오

private String withoutReturnStatement() {
    while(true) {}
    return ""; // unreachable
}

그것은 unreachable진술을 말한다

참고 URL : https://stackoverflow.com/questions/25154495/infinite-loop-breaks-method-signature-without-compilation-error

반응형