반응형
무한 루프는 컴파일 오류없이 메서드 서명을 중단합니다.
이 질문에 이미 답변이 있습니다.
- void가 아닌 메서드에서 반환 문이 누락되면 13 개의 답변이 컴파일됩니다.
컴파일 오류가 발생하지 않고 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
진술을 말한다
반응형
'program tip' 카테고리의 다른 글
jasmine으로 단위 테스트를 할 때 AngularJS에서 서비스를 어떻게 모의합니까? (0) | 2020.11.18 |
---|---|
SQL 바꾸기 함수 내부의 정규식 패턴? (0) | 2020.11.18 |
Java : java.util.Preferences 실패 (0) | 2020.11.18 |
Android : GridView auto_fit은 열 수를 어떻게 찾습니까? (0) | 2020.11.18 |
루비 : define_method 대 def (0) | 2020.11.17 |