2014-01-18 4 views
0

간단한 질문이 있습니다. 다음의 두 개의 코드에 제 return 문에서 finally 블록
finally 블록이있는 메서드에서 return 문을 배치합니다.

public int method1(){ 
    try{ 
     // Some Stuff 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } finally{ 
     return 0; 
    } 
} 

둘째 return 문 내부에 배치된다

public int method1(){ 
    try{ 
     // Some Stuff 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } finally{ 

    } 
    return 0; 
} 

두 간의 차이가 정상적으로 배치? 그리고 더 나은 옵션으로 사용할 수 있습니까? 왜?

+0

finally 블록 내에 return 문을 사용해서는 안됩니다. 이렇게하면 try 블록에서 수행 된 작업을 덮어 쓸 수 있으며 실제로 복잡한 논리로 이어질 수 있습니다. –

+0

finally 블록에 반환되는 모든 항목은 try/catch 블록 내에있는 예외 또는 반환 값을 실제로 재정의합니다. –

답변

6

finally 블록에서 "return"을 사용하는 것은 좋지 않습니다. finally 블록 인해 두 가지 이유에 실행할 수 있습니다 :

(가) 예외가 try 블록에 의해 슬로우 (그리고 catch 블록에 의해 체포 된 것이 아님) -이 경우 메소드는 반환 값 때문에 return something 문의가 없습니다 finally 블록은 효과가 없습니다. (b) try 블록이 정상적으로 완료되었다. 그 블록이 return something으로 끝나면 독자는 코드가 약간 혼란 스럽습니다. 이제는 관련성이있는 두 개의 return 문과 다른 문보다 우선해야하는 문이 명확하지 않기 때문입니다.

+0

** 항상 ** 나쁜 습관입니다. – MariuszS

+1

수정하십시오. 결정된. –

+0

* (a) ...이 경우 메소드는 리턴 값을 가지지 않을 것입니다. * -'catch' 브랜치에 catnt 한 예외가 없다는 것을 의미합니다. – kajacx

관련 문제