2013-11-27 4 views
0
public int checkGuess(int g, int randomnumber){ 

    number=g; 
    this.randomnumber= randomnumber; 

    if (number == randomnumber) 
     return 0; 

    else if (number < randomnumber) 
     return -1; 

    else if (number > randomnumber) 
     return 1; 

} 

누락 된 반환 오류가 발생하는 이유는 무엇입니까? 모든 if/else가 return을 가지고있는 경우 마지막 대괄호에 오류가 발생합니다.if/else 문에 대한 return 문이 누락되었습니다.

+2

'else'내부 또는 'if/else-if' 전체 외부에서 반환해야합니다. –

+0

묵시적인 else에 대한 return 문이 누락되어 있습니다. –

답변

7

모든 return 문은 if 문 내에 있습니다. 서면으로 논리적으로 불가능할 수도 있지만 컴파일러는 if 중 어느 것도 참이 아닌 경우에 대한 반품을 필요로합니다.

내가 추천 :

public int checkGuess(int number, int randomnumber){ 
    int retVal = 0; 
    this.randomnumber= randomnumber; 

    if (number == randomnumber) { 
     retVal = 0; 
    } else if (number < randomnumber) { 
     retVal = -1; 
    } else if (number > randomnumber) { 
     retVal = 1; 
    } 
    return retVal; 
} 

이 솔루션은 컴파일러 문제를 해결하고 내 의견으로는, 약간 가독성을 향상시킨다.


또는이 해결 방법이 있습니다 :

public int checkGuess(int number, int randomnumber){ 
    this.randomnumber= randomnumber; 

    if (number == randomnumber) { 
     return 0; 
    } else if (number < randomnumber) { 
     return -1; 
    } else if (number > randomnumber) { 
     return 1; 
    } else { 
     //throw an exception 
    } 
}  

당신이 마지막 else에 도착하는 경우가 있기 때문에 틀림없이 무엇이든 ...을 반환하지 않고 방법에서 얻을 수 있도록 예외를 던지고, 뭔가 분명히 잘못되었다.

+0

+1은 예외를 던지는 것을 제안합니다. 이는 코드가 도달 할 수 없다는 확신이들 때 실제로하는 것이 가장 좋습니다. –

+0

정의 된 조건 중 하나를 만족하지 못하는 값을 메서드가 받아들이지 않아야한다고 생각하면 저에게 IllegalArgumentException을 던지는 +1이 가장 좋습니다. – Bnrdo

+0

컴파일러가 오직 세 가지 가능성 만 있다는 것을 알 수 없다고해서 프로그래머가 할 수 없다는 것을 의미하지는 않습니다. –

3

else ifelse으로 변경해보세요. 예상대로 그 작동하려면

if (number == randomnumber) 
    return 0; 

else if (number < randomnumber) 
    return -1; 

else 
    return 1; 
+0

그래, 내가 그 작품을 알고 있지만 숫자가 더 큰 반환 1이라고 말하지 않는 것; 테스터 파일을 엉망으로 만든다. 그 상태를 유지하는 방법은 없습니까? – user3027772

+0

주석을 사용하여이를 지적 할 수 있습니다. – Christian

0

당신은 항상

0

복귀는 else 내부 또는 전체 if/else-if 외부해야한다 반환 알고 당신의 조건을 평가하지 않습니다, else가 필요합니다. 조건에 따라 모든 반품으로 반품이 불가능할 수 있습니다.

if (condition 1) 
    return a; 
else if (condition 2) 
    return b; 
else if (condition 3) 
    return c; 

조건 1, 2 또는 3이 충족되지 않으면 반환되지 않습니다. 반환은 항상 사용할 수있게해야합니다. 그래서 수정은 다음과 같습니다

if (condition 1) 
    return a; 
else if (condition 2) 
    return b; 
else if (condition 3) 
    return c; 
else 
    return d; 

또는

if (condition 1) 
    return a; 
else if (condition 2) 
    return b; 
else if (condition 3) 
    return c 

return d; 
2

컴파일러는 당신의 if/else 나무는 가능한 모든 경우를 포함할지 여부를 알아낼 수있을 필요는 없습니다. 그리고 일부 컴파일러가 괜찮 았다고 판단 할 수있는 코드를 작성하고 다른 컴파일러는 그렇지 않다는 사실이 끔찍합니다. 컴파일러가 얼마나 똑똑해야하는지에 대한 정확한 명세를 갖는 것보다 Java는 명확하고 깨끗한 코드를 작성해야합니다.

함수의 닫는 중괄호는 Java 사양의 정의에 따라 도달 할 수 있습니다. "도달 할 수있는"다른 정의에 의해 도달 할 수 없다는 것을 증명할 수 있다는 것은 중요하지 않습니다. Java 사양의 "도달 가능"은 컴파일러가 실제로 구현할 수있는 사양에서 자세하게 설명 된 공식 개념입니다. 어쨌든 컴퓨터에 결코 가르 칠 수없는 "도달 가능한"개념은 상식이 아닙니다.

0

자바는 무효 메서드가 무언가를 반환하도록 보장합니다 (null 인 경우에도). 정의에 따라 if 문이있는 경우 가끔만 return 문이 실행됩니다.

if(number == randomnumber) { 
    return 0; 
} else if(number < randomnumber) { 
    return -1; 
} else if(number > randomnumber) { 
    return 1; 
} else { 
    return -2; 
} 

else 문은 필요하지 않지만 imo를 더 쉽게 이해할 수 있습니다.

+0

'else return -2; '는 제 의견으로는 읽기가 쉽지 않습니다. 이 대답은 컴파일러 문제를 해결합니다. – nhgrif

2

기본적으로 컴파일러는 number == randomnumber || number < randomnumber || number > randomnumber이 동질감이라는 사실을 알기에 충분히 똑똑하지 않습니다. else이 없기 때문에 조건부를 지나서 다시 돌아 오지 않고 기능의 끝을 맞출 수 있다고 생각합니다. 가장 쉬운 방법은 마지막 elseifelse으로 변경하는 것입니다. 이전 조건에서 알다시피, number > randomnumber이 참이어야합니다. (당신이 편집증 및 확인하려는 경우 어설을 추가 할 수 있습니다.)

1

return 문 후 else 필요가 없습니다 : 이유는이 문제가 해결 것을

if (number == randomnumber) 
    return 0; 

if (number < randomnumber) 
    return -1; 

// Must be true: if (number > randomnumber) 
return 1; 

참고 왜냐하면 컴파일러는 논리적으로 반환해야하는 솔루션을 확인하지 않기 때문입니다. 예 : A는> < 또는 = B 여야하며 해당 관계를 확인하지 않습니다. 그것은 모든 경로를 명시 적으로 커버하는 가능성을 찾고 있습니다.

+0

return을 따르는 else가 필요하지는 않지만 가독성을 높이는 데 도움이됩니다 (특히'if '본문이 단순한'return 0;'인 경우). 그러나 그 부분은 실제 문제와 관련이 없습니다 (여러분의 게시 된 코드가 문제를 해결할지라도 ... 오해의 소지가있는 대답을 남겨 두면서 문제를 설명하지는 않습니다.) – nhgrif

+0

@nhgrif 이유를 설명하고 '{}'를 사용하여 else를 유무와 상관없이 명확하게 만듭니다. –

+0

@nhgrif IF-'returns 문 뒤에 ELSE가 사용되지 않으면 코드가 더 읽기 쉽고 논리적이라고 생각합니다. – MaxZoom

관련 문제