当我按下按钮对两个值求和时应用程序崩溃

App crash when I press the button to sum two values

当我尝试按下按钮对编辑文本求和时,我的应用程序崩溃了,我不知道如何修复,因为我看不到应用程序日志。 我如何查看我的日志?

我的代码(MainActivity.kt):

package com.example.paymentothetrip

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Window
import android.widget.Button
import android.widget.EditText
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    @SuppressLint("WrongViewCast")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        requestWindowFeature(Window.FEATURE_NO_TITLE)

        setContentView(R.layout.activity_main)
        var kmtotal = findViewById<EditText>(R.id.ikmtotal)
        var ilitro = findViewById<EditText>(R.id.ilitro)
        var ikmforlit = findViewById<EditText>(R.id.ikmforlit)
        val btncalcular: TextView = findViewById<Button>(R.id.btncalcular)

        btncalcular.setOnClickListener{
            calcular(kmtotal, ikmforlit, ilitro, )
        }
    }

    @SuppressLint("SetTextI18n")
    private fun calcular(kmtotal: EditText, ikmforlit: EditText, ilitro: EditText) {

        val txtresult = findViewById<TextView>(R.id.txtresult)
        var result: Double = (kmtotal.text.toString().toDouble() / ikmforlit.text.toString().toDouble()) * ilitro.toString().toDouble()

        txtresult.text = "R$ $result"

    }
}

LOGCAT:

2022-02-26 21:16:10.655 19167-19167/com.example.paymentothetrip E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.paymentothetrip, PID: 19167
    java.lang.NumberFormatException: For input string: "androidx.appcompat.widget.AppCompatEditText{28c5fa0 VFED..CL. ........ 0,745-1080,883 #7f0a01df app:id/ilitro aid=1073741825}"
        at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
        at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
        at java.lang.Double.parseDouble(Double.java:538)
        at com.example.paymentothetrip.MainActivity.calcular(MainActivity.kt:32)
        at com.example.paymentothetrip.MainActivity.onCreate$lambda-0(MainActivity.kt:24)
        at com.example.paymentothetrip.MainActivity.$r8$lambda$x4PiI7hxLHE9UUw2OiqZu2i-kE4(Unknown Source:0)
        at com.example.paymentothetrip.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:8)
        at android.view.View.performClick(View.java:7125)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access00(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
2022-02-26 21:16:10.670 19167-19167/com.example.paymentothetrip I/Process: Sending signal. PID: 19167 SIG: 9

(只是解释了如何追踪错误 - 修复在底部)

您的错误日志表明这是崩溃的原因:

java.lang.NumberFormatException: For input string: "androidx.appcompat.widget.AppCompatEditText{28c5fa0 VFED..CL. ........ 0,745-1080,883 #7f0a01df app:id/ilitro aid=1073741825}"

A NumberFormatException 通常是在您尝试将某些文本转换为数字但无法成功时引起的 - 它的格式不像可识别的数字。您在此处尝试将 Strings 解析为 Doubles,因此字符串很可能包含无法读取为有效 Double.

的文本

错误告诉您导致错误的输入字符串:

"androidx.appcompat.widget.AppCompatEditText{28c5fa0 VFED..CL. ........ 0,745-1080,883 #7f0a01df app:id/ilitro aid=1073741825}"

这就是你打电话给 toDouble() 的原因。明显不对吧?您期待 1.234 之类的内容或您输入的任何内容。该文本是对 AppCompatEditText 对象(小部件本身)的引用。从该小部件获取文本内容时出现问题。

所以让我们看看你的代码,你从那些 EditTexts 中读取文本,并尝试将它们解析为 Doubles:

var result: Double = (kmtotal.text.toString().toDouble() / ikmforlit.text.toString().toDouble())
    * ilitro.toString().toDouble()

你看哪一个不一样?对于前两个,您正在访问 kmtotal.textikmforlit.text 并对其调用 toString,以获取字符串形式的 text 内容。但对于最后一个,您没有访问它的 text - 您正在调用 EditText 本身的 toString()。这就是为什么您在错误消息中得到对象的描述 - 这就是您要解析的字符串


所以解决方案是您需要将其更改为 ilitro.text.toString() 而不是 ilitro.toString()。我只是想解释为什么会这样,以及如何使用错误日志来追踪问题。它也告诉你问题出在哪里:

at com.example.paymentothetrip.MainActivity.calcular(MainActivity.kt:32)

这是 您的 代码中堆栈跟踪的第一行,这是您的代码在错误发生之前所做的最后一件事(MainActivity 的第 32 行)。这是开始查找错误的好地方!