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

Android Studio中Kotlin的setOnClickListener调用calc()函数崩溃问题

解决Android应用点击按钮闪退的NumberFormatException问题

问题根源

从报错日志java.lang.NumberFormatException: empty String可以定位:你在onCreate()方法中提前获取了EditText的文本内容,此时EditText还没有用户输入,vi和height保存的是空字符串。当点击按钮调用toDouble()时,空字符串无法转换为Double类型,直接触发崩溃。

修复步骤

  1. 延迟文本获取时机:只在onCreate()中获取EditText的控件实例,把文本读取操作移到按钮的点击事件内部,确保获取的是用户输入后的内容。
  2. 添加输入校验:在转换数字前检查输入是否有效,避免空值或非数字输入导致的异常。

修改后的代码

package com.example.fallingobject

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import kotlin.math.sqrt

fun calc(vi: Double, height: Double): String {
    val a = 9.8
    val vf = sqrt((vi * vi) + 2 * a * height)
    val va = (vf + vi) / 2
    val t = height / va
    return t.toString()
}

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

        val calcBtn = findViewById<Button>(R.id.calcBtn)
        // 只获取控件实例,不提前读取文本
        val viInput = findViewById<EditText>(R.id.sIn)
        val heightInput = findViewById<EditText>(R.id.hIn)
        
        calcBtn.setOnClickListener {
            // 点击时才读取输入文本,trim()去除首尾空格
            val viStr = viInput.text.toString().trim()
            val heightStr = heightInput.text.toString().trim()
            
            // 校验输入是否为空
            if (viStr.isEmpty() || heightStr.isEmpty()) {
                Toast.makeText(this, "请输入完整的速度和高度", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }
            
            // 安全转换为Double,避免非数字输入导致崩溃
            val vi = viStr.toDoubleOrNull()
            val height = heightStr.toDoubleOrNull()
            
            if (vi == null || height == null) {
                Toast.makeText(this, "请输入有效的数字", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }
            
            val calculation = calc(vi, height)
            Toast.makeText(this@MainActivity, calculation, Toast.LENGTH_SHORT).show()
        }
    }
}

额外优化建议

  • 给EditText添加hint属性,提示用户输入内容,比如在xml中添加android:hint="请输入初始速度"
  • 如果需要支持小数输入,把EditText的inputType改为numberDecimal,方便用户输入非整数数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:37:09