2016-11-21 18 views
-1

私はこのような問題を抱えており、アンドロイドスタジオは到達不能なコードについて警告しています。私は理解できません、どのように到達不能です。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のバグですか、何か不足していますか?

EDIT:

バスケットプロバイダは、単純な列挙型クラスです:

enum class BasketProvider { 
    LOCAL, SHARED 
} 
+1

あなたはfinallyブロックから戻ることはできません。 finallyブロックは常に実行されるので、returnはtryブロックまたはcatchブロックから返されたものに優先し、tryまたはcatchブロックのリターンを到達不能にし、メソッドからスローされた例外を取り込む。最終的にブロックから戻らないでください。悪い習慣です。 finallyブロックは、常にリソースを閉じたり、他のクリーンアップを行うのに便利です。 –

答えて

2

finallyブロック常にあなたのfinallyブロックでの戻り値は常にあなたを上書きしますので、(あなたが挟んSystem.exit()を呼び出さない限り)を実行戻り値を試してみましょう。参照:Does a finally block always run?

ここでは「到達不能コード」が誤解を招く場合があります。「戻り値は常にfinallyブロックで上書きされます」と呼びます。

関連する問題