2016-11-21 9 views
-1

나는이 문제를 해결했으며, android studio는 도달 할 수없는 코드에 대해 경고합니다. 이해가 안 돼, 어떻게 도달 할 수없는거야.kotlin finally와 enum을 사용할 때 도달 할 수없는 코드

내 원래 코드 :

 try { 
      return BasketProvider.valueOf(prefs.getString(KEY_BASKET_PROVIDER, null)) //unreachable code here 
     } finally { 
      return BasketProvider.LOCAL 
     } 

내가 catch(e :IllegalArgumentException)에 마지막으로 변경하는 경우는, 경고가 없습니다. 모두 병합하면 경고가 다시 나타납니다.

 try { 
      return BasketProvider.valueOf(prefs.getString(KEY_BASKET_PROVIDER, null))//no warning 
     } catch (e: IllegalArgumentException) { 
      return BasketProvider.LOCAL 
     } 
     -------------------------------- 
     try { 
      return BasketProvider.valueOf(prefs.getString(KEY_BASKET_PROVIDER, null))//unreachable code 
     } catch (e: IllegalArgumentException) { 
      return BasketProvider.LOCAL //unreachable code 
     } finally { 
      return BasketProvider.LOCAL 
     } 

이것은 Kotlin 버그입니까? 아니면 뭔가 빠졌습니까?

편집 :

바구니 제공자는 단순 열거 클래스입니다 : 항상 실행

enum class BasketProvider { 
    LOCAL, SHARED 
} 
+1

finally 블록에서 돌아 오지 않아도됩니다. finally 블록은 항상 실행되기 때문에 try 또는 catch 블록에서 반환되는 것을 대신하는 return은 try 또는 catch 블록에서 반환을 도달 할 수 없도록 만들고 메서드에서 throw 된 예외를 삼키는 것입니다. 마침내 블록에서 돌아 오지 마라. 나쁜 습관이다. finally 블록은 항상 자원을 닫거나 다른 정리를하는 데 유용합니다. –

답변

2

finally 블록 (당신이 선적 지시 밖에 해줄 수 System.exit()를 호출하지 않는 한) 항상 우선합니다 당신의 마지막 블록 그래서 당신의 반환 값 귀하 시도/반환 값을 잡아라. 참조 : Does a finally block always run?

"연결할 수없는 코드"는 여기에서 오해의 소지가 있습니다. "반환 값은 항상 finally 블록으로 덮어 씁니다"라고해야합니다.