应用程序崩溃,似乎是因为EditText到String到Double/Long的转换



我需要在Room数据库中输入一些值。为此,我需要将用户输入的任何内容转换为Double和Long。出于某种原因,每次我尝试这样做时,应用程序都会崩溃。我很确定问题出在用//Need to fix标记的两个变量中,因为我尝试将它们初始化为0,之后应用程序运行良好。如果需要的话,我很乐意提供更多的信息。这里可能有什么问题?

这是代码:

override fun onResume() {
super.onResume()
var transacType = false
var transacAmount = binding.amountInput.text.toString().toDouble()          //Need to fix
var transacDate: Long = binding.pickedDate.text.toString().toLong()         //Need to fix
var transacCategory: String = "N"
val duration = Toast.LENGTH_SHORT
...
binding.floatingActionButton.setOnClickListener{
if (transacCategory == "N" || transacCategory == "Pick a category…" && binding.spinner2.isVisible) {
val text = "Please pick a category!"
val toast = Toast.makeText(applicationContext, text, duration)
toast.show()
} else if (transacAmount == 0.0) {
val text = "Please input an amount!"
val toast = Toast.makeText(applicationContext, text, duration)
toast.show()
} else {
val transaction = Transactions(0L, transacType, transacAmount, transacDate, transacCategory)
transactionViewModel.insert(transaction)
}
}

我不确定是否有必要,但这是日志中所有我不知道如何阅读的红色内容:

2021-04-02 17:25:54.438 22619-22619/com.example.budgie E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.budgie, PID: 22619
java.lang.RuntimeException: Unable to resume activity {com.example.budgie/com.example.budgie.AddTransactionActivity}: java.lang.NumberFormatException: empty String
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4789)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4832)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:190)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:105)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at com.example.budgie.AddTransactionActivity.onResume(AddTransactionActivity.kt:72)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1465)
at android.app.Activity.performResume(Activity.java:8223)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4779)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4832) 
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) 
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:190) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:105) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386) 
at android.os.Handler.dispatchMessage(Handler.java:107) 
at android.os.Looper.loop(Looper.java:213) 
at android.app.ActivityThread.main(ActivityThread.java:8178) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 

PS。我知道我的代码中可能还有其他问题,但现在我只想解决这个问题。

PSS。我是新来的,对我宽容一点好吗?

你已经得到了答案,但只是为了解释人们是如何知道的(这样你也可以调查谜团(。。。

日志中的红色文本是stacktrace——当你遇到导致应用程序崩溃的异常(一种错误(时,它就会打印出来,它会显示崩溃在哪一行,导致崩溃的方法链,以及导致崩溃的原因。所以你知道发生了什么,你需要去哪里看!

它是按块排列的,第一个从开始

java.lang.RuntimeException: Unable to resume activity [...]
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4789)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4832)
...

所以你的应用程序用CCD_ 2崩溃了,它保存的消息(基本上是解释(是";不能恢复活动";。下一行说,异常是在performResumeActivity()ActivityThread.java的4789行抛出的,您从同一文件中handleResumeActivity()的4832行得到的,等等


有时这很有用,在这种情况下,这都是你没有写的Android内部内容,所以让我们看看下一个块,它是导致performResumeActivity放弃并抛出异常的异常:

Caused by: java.lang.NumberFormatException: For input string: "com.google.android.material.textfield.TextInputEditText{64a283 VFED..CL. ......I. 0,0-0,0 #7f09004a app:id/amount_input}"

和以前一样,但我们不需要再深入研究了——我们在这里就有我们需要的所有信息!此NumberFormatException导致外部RuntimeException导致应用程序崩溃。NumberFormatException通常会在你试图将某些文本作为数字读取时出现,但它不符合合法的格式——它会告诉你导致它的输入字符串,而这绝对不能作为数字读取!

如果你往下看那个区块的堆叠竞速,你会看到这一点:

at java.lang.Double.parseDouble(Double.java:538)
at com.example.budgie.AddTransactionActivity.onResume(AddTransactionActivity.kt:72)

它告诉您,抛出的parseDouble()调用是在AddTransactionActivity的第72行调用的,它基本上指向您自己代码中的问题所在(或开始(。(它有助于向下扫描跟踪,直到您发现com.example.budgie或您的包名称,这样您就可以找到实际代码所在的位置。(

所以,即使你不知道为什么它是错误的,你也知道该看什么!你知道你传递了错误的输入字符串——它应该是TextView中的一个数字,但它是一些东西。你可能不知道这些东西是什么,但希望你能看到";CCD_ 14";在那里,并意识到TextView本身以某种方式参与进来,而你没有得到文本内容。然后你可以去调查一下,看看你做得是否正确。。。

别担心,textView.text的事情也总是让我感到困惑。是的,输入字符串打印在堆栈跟踪的第一行(RuntimeException正在打印其原因的消息(,但我想表明,你可以单独查看每个块,并读取跟踪,以找出事情发生的确切位置

希望这能帮助你或其他人!

binding.amountInput是EditText的类型,您试图对EditText执行toString((操作,而不是对EditText中的文本执行。由于它是对象类型,toString只打印它的类型com.google.android.material.textfield.TextInputEditText,然后尝试将此字符串转换为数字,这会导致异常。您需要做的是:RuntimeException0

最新更新