문제

저는 놀랐습니다 최근을 찾는 것이 가능하 return 문에서 마지막으로 블록에서 Java.

그것처럼 보인다 많은 사람들의 생각은 나쁜 것으로 설명서'으로 돌아오지 않에서 마지막으로 절'.긁는 좀 더 깊이,나 또한 발견'Java 의 반환하지 않는 항상'는 일부를 보여줍니다 정말 끔찍의 예에는 다른 유형의 흐름을 제어에 마지막으로 블록입니다.

그래서 제 질문은,사람이 나에게 예를 들어익 계산서(또는 다른 흐름제어에서)마지막으로 차단 더 나은/읽기 코드?

도움이 되었습니까?

해결책

예제를 제공하는 충분한 이유를 사용 흐름 제어에서 마지막으로.

가 있는 경우에도 인위적인 예제 어디 그것은"좋은,"고려한 개발자들을 유지하는 코드를 나중에 그 사람의 차이를 인식하지 못합니다.의 미묘한 차이.는 가난한 개발자도 있습니다........

다른 팁

내가 정말 힘든 시간을 추적하는 버그 년 전에는에 의해 발생했다.코드 같은 것:

Object problemMethod() {
    Object rtn = null;
    try {
        rtn = somethingThatThrewAnException();
    }
    finally {
        doSomeCleanup();
        return rtn;
    }
}

무슨 일이 일어났는 예외가 발생했에서 일부는 다른 코드입니다.그것은 적발되고 기록되고 다시 throw 내 somethingThatThrewAnException() 방법입니다.그러나 예외 없이 전파되는 과거 problemMethod().오랜 시간 후에서 보이는 우리가 마지막으로 추적하는 반환 방법입니다.반환 방법에 마지막으로 차단은 기본적으로 정지하는 예외에서 일어난도록 전달되더라도 그것은 없었다.

다른 사람처럼 말하는 동안,그것은 법인을 반환에서 마지막으로 블록에 따라 Java spec,그것이 나쁜 일이지를 수행 할 수 있습니다.

javac 경고의 반환에서 마지막으로 사용하는 경우-Xlint:마지막으로.원래 javac 방출한 경고-면 뭔가 잘못된 코드와 함께,그것은 컴파일되지 않습니다.불행하게도 이전 버전 호환성을 의미하는 예상하지 못하는 독창적인 어리석음이 될 수 없을 금지합니다.

예외가 발생할 수 있에서 마지막으로 블록이지만,이 경우 전시 행동은 거의 확실히 당신이 무엇을 원합니다.

를 추가하 제어 구조 및 반환을 마지막으로{}블록의 또 다른 예는"그냥할 수 있기 때문에"남용에 걸쳐 흩어져있는 거의 모든 개발 언어입니다.Jason 은 오른쪽에서 그것을 제안이 쉽게 될 수 유지 관리하는 데 큰 어려움이 인수에 대한 조기 반환에서 기능이 더 적용-그래서 이 경우"늦게 반환합".

마지막으로 블록가 존재하는 하나의 목적을 위해,당신을 허용하는 완전히 정리한 후에 자신을,무슨 일이 있었는지에 상관없이 모든 선행하는 코드입니다.주로 이가 닫기/해제 파일 포인터,데이터베이스 연결,etc., 하지만 내가 볼 수 있었다고 늘 말에 추가하는 맞춤형 감사합니다.

아무것도에 영향을 미치는 반환하는 함수해야에서 거짓말을 하려고{}니다.는 경우에도 당신 방법으로 확인한 외부 주었는데,시간이 많이 걸리는 작업,그 확인하는 상태에서 다시는 경우 그것은 잘못되었,당신은 여전히 원하는 두 번째는 체크 내부 try{}-는 경우 그 내부에 앉아 마지막으로{}고 긴 작업에 실패했을때 확인하는 상태에 있는 두 번째 시간 불필요.

간단한 그루브한 테스트:

public class Instance {

  List<String> runningThreads = new ArrayList<String>()

  void test(boolean returnInFinally) {

    println "\ntest(returnInFinally: $returnInFinally)"
    println "--------------------------------------------------------------------------"
    println "before execute"
    String result = execute(returnInFinally, false)
    println "after execute -> result: " + result
    println "--------------------------------------------------------------------------"

    println "before execute"
    try {
      result = execute(returnInFinally, true)
      println "after execute -> result: " + result
    } catch (Exception ex) {
      println "execute threw exception: " + ex.getMessage()
    }  
    println "--------------------------------------------------------------------------\n"

  }

  String execute(boolean returnInFinally, boolean throwError) {
      String thread = Thread.currentThread().getName()
      println "...execute(returnInFinally: $returnInFinally, throwError: $throwError) - thread: $thread"
      runningThreads.add(thread)
      try {
        if (throwError) {
          println "...error in execute, throw exception"
          throw new Exception("as you liked :-)")
        }
        println "...return 'OK' from execute"
        return "OK"
      } finally {
        println "...pass finally block"
        if (returnInFinally) return "return value from FINALLY ^^"
        // runningThreads.remove(thread)
      }
  }
}

Instance instance = new Instance()
instance.test(false)
instance.test(true)

출력:

test(returnInFinally: false)
-----------------------------------------------------------------------------
before execute
...execute(returnInFinally: false, throwError: false) - thread: Thread-116
...return 'OK' from execute
...pass finally block
after execute -> result: OK
-----------------------------------------------------------------------------
before execute
...execute(returnInFinally: false, throwError: true) - thread: Thread-116
...error in execute, throw exception
...pass finally block
execute threw exception: as you liked :-)
-----------------------------------------------------------------------------


test(returnInFinally: true)
-----------------------------------------------------------------------------
before execute
...execute(returnInFinally: true, throwError: false) - thread: Thread-116
...return 'OK' from execute
...pass finally block
after execute -> result: return value from FINALLY ^^
-----------------------------------------------------------------------------
before execute
...execute(returnInFinally: true, throwError: true) - thread: Thread-116
...error in execute, throw exception
...pass finally block
after execute -> result: return value from FINALLY ^^
-----------------------------------------------------------------------------

질문:

한 가지 흥미로운 지점을 위해 나를 보는 방법 그루브한 거래와 함께 암시적 반환합니다.에서 그루브한 것이 가능하"반품"에서는 방법은 단순히 떠나는 끝 값(지 않고 반환).당신은 무슨 생각하는 경우에,당신은 주석 runningThreads.제거(..) 줄 마지막으로 문이 이것을 덮어쓰 일반 반환 값("OK")그리고 덮개를 제외?!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top