【发布时间】:2019-11-21 08:54:42
【问题描述】:
我正在学习一个旧的 Kotlin 课程,由于他们的课程已经很老了,我认为他们不再回复 Q&A。
我的问题是该应用程序运行良好,但是一旦我实现了一种背景颜色方法,它就会停止。
这是我得到的致命错误:
2019-11-21 11:46:14.035 31147-31147/com.example.smack E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.smack, PID: 31147
java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:876)
at java.util.Scanner.next(Scanner.java:1502)
at java.util.Scanner.nextDouble(Scanner.java:2431)
at com.example.smack.Services.UserDataService.returnAvatarColor(UserDataService.kt:35)
at com.example.smack.Controller.MainActivity$userDataChangeReciever$1.onReceive(MainActivity.kt:72)
at androidx.localbroadcastmanager.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:313)
at androidx.localbroadcastmanager.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:121)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
主要关注UserDataService.kt:35),这是我将颜色从双精度转换为 Int 的地方:
fun returnAvatarColor(components: String) : Int {
val strippedColor = components.replace("[", "").replace("]", "").replace(",", "")
var r = 0
var g = 0
var b = 0
val scanner = Scanner(strippedColor)
if (scanner.hasNext()) {
r = (scanner.nextDouble() * 255).toInt()
g = (scanner.nextDouble() * 255).toInt()
b = (scanner.nextDouble() * 255).toInt()
}
return Color.rgb(r,g,b)
}
然后是(MainActivity.kt:72),这是我获取方法以显示它的位置:
userImageNavHeader.setBackgroundColor(UserDataService.returnAvatarColor(UserDataService.avatarColor))
每当我运行该应用程序时,它都可以正常工作,但是一旦我尝试创建头像并获取其background color,它就会崩溃,如果我删除该方法,它就会恢复正常工作。
【问题讨论】:
-
什么字符串被传递给
returnAvatarColor()导致它崩溃? (即UserDataService.avatarColor是什么?) -
@gidds 它只是一个空的
var avatarColor = "",它将从显示背景颜色的 returnAvatarColor 中获取值 -
堆栈跟踪显示您对
Scanner.nextDouble()的调用失败,因为它正在扫描的字符串此时没有有效的双精度。要了解原因,您需要知道它正在扫描的字符串 - 即strippedColor包含的内容。这取决于传递 到returnAvatarColor()的字符串(如components)。找到它,问题可能就会变得清晰。 -
错误来自 `g = (scanner.nextDouble() * 255).toInt()` 或者至少这是它指向我的地方,但它的执行方式与 r 和b 所以我不明白为什么会出现错误...我还从课程中下载了源代码以检查我的代码是否有差异,但我没有错过任何内容>
-
设法解决了这个问题,由于某种原因,val 扫描仪无法正常工作,所以我将其删除,现在终于可以正常工作了
标签: kotlin error-handling fatal-error