You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio(Giraffe)单位换算APP点击千米/英里转换时崩溃求助

问题解决:单位换算APP千米/英里转换崩溃

核心问题分析

  • 变量与控件ID绑定错误:初始化EditText时,etMilesToKilometers和etKilometersToMiles对应的ID搞反了,导致点击按钮时读取的是错误的输入控件,这会引发逻辑错误甚至空指针问题。
  • 未处理数字格式异常:直接调用toDouble()时,若输入框为空或输入非数字字符,会抛出NumberFormatException,这是点击按钮后APP崩溃的主要原因。

修正后的代码

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 修正控件与ID的对应关系
        val etInchesToCentimeters = findViewById<EditText>(R.id.etInchesToCentimeters)
        val etCentimeterToInches = findViewById<EditText>(R.id.etCentimetersToInches)
        val etKilometersToMiles = findViewById<EditText>(R.id.etKilometersToMiles)
        val etMilesToKilometers = findViewById<EditText>(R.id.etMilesToKilometers)

        val tvInchesToCentimeters = findViewById<TextView>(R.id.tvInchesToCentimeterResult)
        val tvCentimetersToInches = findViewById<TextView>(R.id.tvCentimetersToInchesResult)
        val tvKilometersToMiles = findViewById<TextView>(R.id.tvKilometersToMilesResult)
        val tvMilesToKilometers = findViewById<TextView>(R.id.tvMilesToKilometersResult)

        val btnInchesToCentimeters = findViewById<Button>(R.id.btnInchestoCentimeters)
        val btnCentimetersToInches = findViewById<Button>(R.id.btnCetimetersToInches)
        val btnKilometersToMiles = findViewById<Button>(R.id.btnKilometersToMiles)
        val btnMilesToKilometers = findViewById<Button>(R.id.btnMilesToKilometers)

        // 英寸转厘米
        btnInchesToCentimeters.setOnClickListener(){
            val input = etInchesToCentimeters.text.toString().trim()
            if (input.isNotEmpty()) {
                try {
                    val inches = input.toDouble()
                    val result = inches * 2.54
                    tvInchesToCentimeters.text = result.toString()
                    Toast.makeText(applicationContext, "已转换英寸到厘米", Toast.LENGTH_SHORT).show()
                } catch (e: NumberFormatException) {
                    Toast.makeText(applicationContext, "请输入有效数字", Toast.LENGTH_SHORT).show()
                }
            } else {
                Toast.makeText(applicationContext, "请输入数值", Toast.LENGTH_SHORT).show()
            }
        }

        // 厘米转英寸
        btnCentimetersToInches.setOnClickListener(){
            val input = etCentimeterToInches.text.toString().trim()
            if (input.isNotEmpty()) {
                try {
                    val centimeter = input.toDouble()
                    val result = centimeter * 0.393701
                    tvCentimetersToInches.text = result.toString()
                    Toast.makeText(applicationContext, "已转换厘米到英寸", Toast.LENGTH_SHORT).show()
                } catch (e: NumberFormatException) {
                    Toast.makeText(applicationContext, "请输入有效数字", Toast.LENGTH_SHORT).show()
                }
            } else {
                Toast.makeText(applicationContext, "请输入数值", Toast.LENGTH_SHORT).show()
            }
        }

        // 千米转英里
        btnKilometersToMiles.setOnClickListener() {
            val input = etKilometersToMiles.text.toString().trim()
            if (input.isNotEmpty()) {
                try {
                    val kilometer = input.toDouble()
                    val result = kilometer * 0.621371
                    tvKilometersToMiles.text = result.toString()
                    Toast.makeText(applicationContext, "已转换千米到英里", Toast.LENGTH_SHORT).show()
                } catch (e: NumberFormatException) {
                    Toast.makeText(applicationContext, "请输入有效数字", Toast.LENGTH_SHORT).show()
                }
            } else {
                Toast.makeText(applicationContext, "请输入数值", Toast.LENGTH_SHORT).show()
            }
        }

        // 英里转千米
        btnMilesToKilometers.setOnClickListener() {
            val input = etMilesToKilometers.text.toString().trim()
            if (input.isNotEmpty()) {
                try {
                    val mile = input.toDouble()
                    val result = mile * 1.609344
                    tvMilesToKilometers.text = result.toString()
                    Toast.makeText(applicationContext, "已转换英里到千米", Toast.LENGTH_SHORT).show()
                } catch (e: NumberFormatException) {
                    Toast.makeText(applicationContext, "请输入有效数字", Toast.LENGTH_SHORT).show()
                }
            } else {
                Toast.makeText(applicationContext, "请输入数值", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

关键修正点说明

  1. 修正控件绑定:调换etMilesToKilometers和etKilometersToMiles对应的ID,确保变量指向正确的输入框。
  2. 添加输入校验:
    • 先判断输入是否为空,为空时提示用户输入数值。
    • 用try-catch包裹toDouble()转换,捕获数字格式异常,避免APP崩溃,同时提示用户输入有效数字。
  3. 优化逻辑:将结果变量在点击事件内声明,无需全局定义未初始化的变量,减少潜在问题。

内容的提问来源于stack exchange,提问作者Imaginewagons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:44:55