当我按下按钮对两个值求和时应用程序崩溃
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
通常是在您尝试将某些文本转换为数字但无法成功时引起的 - 它的格式不像可识别的数字。您在此处尝试将 String
s 解析为 Double
s,因此字符串很可能包含无法读取为有效 Double
.
的文本
错误告诉您导致错误的输入字符串:
"androidx.appcompat.widget.AppCompatEditText{28c5fa0 VFED..CL. ........ 0,745-1080,883 #7f0a01df app:id/ilitro aid=1073741825}"
这就是你打电话给 toDouble()
的原因。明显不对吧?您期待 1.234
之类的内容或您输入的任何内容。该文本是对 AppCompatEditText
对象(小部件本身)的引用。从该小部件获取文本内容时出现问题。
所以让我们看看你的代码,你从那些 EditText
s 中读取文本,并尝试将它们解析为 Double
s:
var result: Double = (kmtotal.text.toString().toDouble() / ikmforlit.text.toString().toDouble())
* ilitro.toString().toDouble()
你看哪一个不一样?对于前两个,您正在访问 kmtotal.text
和 ikmforlit.text
并对其调用 toString
,以获取字符串形式的 text
内容。但对于最后一个,您没有访问它的 text
- 您正在调用 EditText
本身的 toString()
。这就是为什么您在错误消息中得到对象的描述 - 这就是您要解析的字符串
所以解决方案是您需要将其更改为 ilitro.text.toString()
而不是 ilitro.toString()
。我只是想解释为什么会这样,以及如何使用错误日志来追踪问题。它也告诉你问题出在哪里:
at com.example.paymentothetrip.MainActivity.calcular(MainActivity.kt:32)
这是 您的 代码中堆栈跟踪的第一行,这是您的代码在错误发生之前所做的最后一件事(MainActivity
的第 32 行)。这是开始查找错误的好地方!
当我尝试按下按钮对编辑文本求和时,我的应用程序崩溃了,我不知道如何修复,因为我看不到应用程序日志。 我如何查看我的日志?
我的代码(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
通常是在您尝试将某些文本转换为数字但无法成功时引起的 - 它的格式不像可识别的数字。您在此处尝试将 String
s 解析为 Double
s,因此字符串很可能包含无法读取为有效 Double
.
错误告诉您导致错误的输入字符串:
"androidx.appcompat.widget.AppCompatEditText{28c5fa0 VFED..CL. ........ 0,745-1080,883 #7f0a01df app:id/ilitro aid=1073741825}"
这就是你打电话给 toDouble()
的原因。明显不对吧?您期待 1.234
之类的内容或您输入的任何内容。该文本是对 AppCompatEditText
对象(小部件本身)的引用。从该小部件获取文本内容时出现问题。
所以让我们看看你的代码,你从那些 EditText
s 中读取文本,并尝试将它们解析为 Double
s:
var result: Double = (kmtotal.text.toString().toDouble() / ikmforlit.text.toString().toDouble())
* ilitro.toString().toDouble()
你看哪一个不一样?对于前两个,您正在访问 kmtotal.text
和 ikmforlit.text
并对其调用 toString
,以获取字符串形式的 text
内容。但对于最后一个,您没有访问它的 text
- 您正在调用 EditText
本身的 toString()
。这就是为什么您在错误消息中得到对象的描述 - 这就是您要解析的字符串
所以解决方案是您需要将其更改为 ilitro.text.toString()
而不是 ilitro.toString()
。我只是想解释为什么会这样,以及如何使用错误日志来追踪问题。它也告诉你问题出在哪里:
at com.example.paymentothetrip.MainActivity.calcular(MainActivity.kt:32)
这是 您的 代码中堆栈跟踪的第一行,这是您的代码在错误发生之前所做的最后一件事(MainActivity
的第 32 行)。这是开始查找错误的好地方!