StackOverflowError 在 Kotlin 中使用 Singleton
StackOverflowError using Singleton in Kotlin
谁能告诉我,为什么我使用这个 Kotlin class 得到一个 java.lang.WhosebugError
?第 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
}
}
}
堆栈跟踪:
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.WhosebugError: 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.WhosebugError
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.WhosebugError: 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
您正在递归调用 instance
getter 方法。将您的 getter 定义改为使用 field
:
var instance: TokenHelper? = null
get() {
if (field == null) {
field = TokenHelper()
}
return field
}
相关文档摘录:
Classes in Kotlin cannot have fields. However, sometimes it is
necessary to have a backing field when using custom accessors. For
these purposes, Kotlin provides an automatic backing field which can
be accessed using the field identifier:
var counter = 0 // the initializer value is written directly to the backing field
set(value) {
if (value >= 0)
field = value
}
The field identifier can only be used in the accessors of the property.
改编自对原始答案的评论:
在 Kotlin 中,您不需要所有样板文件来声明单例。声明您的 class 时,只需将其设为 object
,如下所示:
object TokenHelper {
var token: String? = null
var appId: String? = null
var installationId: String? = null
var userId: String? = null
}
然后按如下方式访问它:TokenHelper.token
或来自 Java TokenHelper.INSTANCE.getToken()
.
谁能告诉我,为什么我使用这个 Kotlin class 得到一个 java.lang.WhosebugError
?第 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
}
}
}
堆栈跟踪:
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.WhosebugError: 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.WhosebugError
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.WhosebugError: 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
您正在递归调用 instance
getter 方法。将您的 getter 定义改为使用 field
:
var instance: TokenHelper? = null
get() {
if (field == null) {
field = TokenHelper()
}
return field
}
相关文档摘录:
Classes in Kotlin cannot have fields. However, sometimes it is necessary to have a backing field when using custom accessors. For these purposes, Kotlin provides an automatic backing field which can be accessed using the field identifier:
var counter = 0 // the initializer value is written directly to the backing field set(value) { if (value >= 0) field = value }
The field identifier can only be used in the accessors of the property.
改编自对原始答案的评论:
在 Kotlin 中,您不需要所有样板文件来声明单例。声明您的 class 时,只需将其设为 object
,如下所示:
object TokenHelper {
var token: String? = null
var appId: String? = null
var installationId: String? = null
var userId: String? = null
}
然后按如下方式访问它:TokenHelper.token
或来自 Java TokenHelper.INSTANCE.getToken()
.