2016-04-11 34 views
4

Bu Kotlin sınıfını kullanarak neden bir java.lang.StackOverflowError alıyorum diyebilirim?Kotlin'de Tekton kullanarak StackOverflowError

04-11 19:07:42.188 16142-16142/com.foo.bar.debug E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.foo.bar.debug, PID: 16142 
    java.lang.StackOverflowError: stack size 8MB 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:0) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
     at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41 
04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: exClass=java.lang.StackOverflowError 
04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: exMsg=stack size 8MB 
04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: file=TokenHelper.kt 
04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: class=com.foo.bar.helper.TokenHelper$Companion 
04-11 19:07:42.271 16142-16142/com.foo.bar.debug D/Error: ERR: method=getInstance line=0 
04-11 19:07:42.282 16142-16142/com.foo.bar.debug D/Error: ERR: stack=java.lang.StackOverflowError: stack size 8MB 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:0) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(TokenHelper.kt:41) 
    at com.foo.bar.helper.TokenHelper$Companion.getInstance(
04-11 19:07:42.283 16142-16142/com.foo.bar.debug D/Error: ERR: TOTAL BYTES WRITTEN: 880768 
04-11 19:07:45.527 16142-16142/com.foo.bar.debug D/Process: killProcess, pid=16142 
04-11 19:07:45.528 16142-16142/com.foo.bar.debug D/Process: com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:113 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 

Android Studio 2.0, Kotlin 1.0.1-2

+1

Eğer TokenHelper'ı bir singleton yapmak istiyorsanız, sadece 'object' olarak bildirin ve 'instance' özelliğini tamamen bırakın. Derleyici, sizin için boilerplate ile ilgilenecektir. –

+0

@KirillRakhman Yorumunuzun gerçek cevap olduğuna inanıyorum. Şimdi bir nesne ve ben 'TokenHelper.INSTANCE.getToken() '(Java sınıfında) gibi kullanıyorum. – user3105453

+0

Yanıt olarak ekledim. –

cevap

1

: KOTLIN yılında

, sen a tek ilan etmek tüm klişe gerekmez. Sınıfınızı bildirerek zaman, sadece bir object şöyle yapın: TokenHelper.token veya Java TokenHelper.INSTANCE.getToken() den şu şekildedir:

object TokenHelper { 
    var token: String? = null 
    var appId: String? = null 
    var installationId: String? = null 
    var userId: String? = null 
} 

Sonra erişmek.

8

Sen damgası instance alıcı yöntemini aradığınız: Hat 41 if (instance == null) {

class TokenHelper protected constructor() { 
    var token: String? = null 
    var appId: String? = null 
    var installationId: String? = null 
    var userId: String? = null 

    companion object { 
     var instance: TokenHelper? = null 
      get() { 
       if (instance == null) { 
        instance = TokenHelper() 
       } 
       return instance 
      } 
    } 
} 

StackTrace olduğunu. yerine field kullanmak size alıcı tanımını değiştirin:

var instance: TokenHelper? = null 
    get() { 
     if (field == null) { 
      field = TokenHelper() 
     } 
     return field 
    } 

ilgili alıntı belgelerinden: KOTLIN içinde

Sınıflar alanlara sahip olamaz. Ancak, bazen özel erişim kullananlar için bir destek alanına sahip olmak gereklidir.

var counter = 0 // the initializer value is written directly to the backing field 
    set(value) { 
    if (value >= 0) 
     field = value 
    } 

alan tanımlayıcısı, sadece özelliği erişimcileri kullanılabilir: Bu amaçlar için, Kotlin alan tanıtıcısı kullanılarak erişilebilir otomatik bir destek alanı oluşturur. Orijinal cevap yorumunda uyarlanmış

+1

Teşekkürler. Ben sadece "Kotlin Singleton" googled ve bu çözüm ile geldi (https://medium.com/@adinugroho/singleton-in-kotlin-502f80fd8a63#.64ssyu1by): 'private object Tutucu { val INSTANCE = TokenHelper () } refakatçi nesne { val örneği: tarafından TokenHelper tembel {Holder.INSTANCE} } ' o Kotlin çok uyumlu olduğunu düşünüyor musunuz? Btw: İlk kodum, "Kotlin'e Dönüştür" komutunu yükselterek AS tarafından oluşturuldu. – user3105453

+1

Evet, uyumludur. IDE dönüştürücü çok basit durumlar için iyi çalışır - çıkışlar her zaman kullanımdan önce gözden geçirilmelidir. – miensol

+0

beni kurtardı! Teşekkürler . –