2012-05-28 2 views
9

가능한 중복 : 위의 코드에서
what happens to an object in Java if you do not reference it, like here : myString.concat(“that”)변수에 메서드의 반환 값을 할당해야하는 이유가 무엇입니까?

public class ReturnTest 
{ 
    public static void main(String[] args) 
    { 
     ReturnTest rt = new ReturnTest(); 
     rt.show(); 
    } 

    public String show() 
    { 
     return "Hello"; 
    } 
} 

show() 방법은 변수에 의해 포착되지 않은 String 값을 반환한다. 컴파일러도 JVM도 경고, 오류 또는 예외를 발생시키지 않습니다. 원시적 인 반환 값의 경우도 같습니다. 왜?

컴파일러는 메소드에서 반환 된 중요한 값을 잃어 버리지 않아야합니까?

어떻게 이것을 쉘에서 해결할 수 있습니까 ??

+1

값을 변수에 할당하지만 검사하지 않으면 어떻게됩니까? 만약 당신이 그것을 검토하지만 그 심사에 기초하여 "올바른"결정을 내리지 못하면 어떨까요? 컴파일러가 "옳은"일을 수행하기 전에 얼마나 멀리 가져 가고 싶습니까? –

답변

10

이것은 언어의 디자인입니다.

대부분의 경우 메서드는 걱정하지 않는 값을 반환합니다. 예를 들어 StringBuilder.append()은 개체 자체를 반환합니다.

어떤 경우에는 중요한 반환 값이 손실 될 수도 있습니다. 예를 들어 InputStream.skip(long n)은 건너 뛴 바이트 수를 반환합니다. read은 읽은 바이트 수를 반환합니다. 이러한 버그를 탐지하는 도구 (Checkstyle, FindBugs)가 있습니다. 그러나 언어 자체는 반환 값 확인을 요청하지 않습니다. 그리고 그렇게하더라도 프로그램은 그 값을 무시할 수 있습니다.

+0

IDE를 사용하지 않고 어떻게 쉘을 통해이 문제를 해결할 수 있습니까 ?? – WickeD

+2

Checkstyle 및 FindBugs는 명령 줄에서 또는 빌드의 일부로 실행할 수 있습니다. 하지만 IDE를 사용하는 것이 어떨까요? –

3

반환 값이 반드시 필요하지 않으므로.

+0

내 질문은 어떻게 우리가 반환 값이 필요하지 않는 자바 생각? – WickeD

+0

그렇지 않습니다. 그것은 단지 할당되지 않았습니다. – Bozho

+2

프로그래머는 자신이하는 일을 알고 있다고 가정합니다. 반환 된 값을 저장하지 않으면 필요하지 않습니다. –

1

자바 함수는 순수하지 않으므로 부작용에 대해서만 실행할 수 있습니다. 이 경우에는 부작용이 없습니다 ... 고려하십시오.

public String show() { 
    System.out.println("Hello"); 
    return "Hello"; 
} 

이제 경고 하시겠습니까? 컴파일러는 부작용이나 값에 대해 실행하는지 알 수 없으므로 왜 주장합니까?

3

반환 값이 항상 사용되어야하는 경우 @CheckReturnValue으로 메소드에 주석을 달 수 있습니다. FindBugs와 같은 정적 코드 분석은이 주석을 고려하고 위반시 경고를 발생시킵니다.

최소한이 메서드는 호출자가 담당하는 끝에 최종 처리가 필요한 일종의 개체를 반환 할 때 매우 적합합니다. 마지막에 닫아야하는 리소스의 경우에도 마찬가지입니다. 끝에 놓아야하는 잠금 장치 ...

관련 문제