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

Kotlin开发EMI计算器应用:代码无问题却报错崩溃

Kotlin Android EMI计算器应用修复方案

你的代码存在以下关键问题:

  • EditText值提取错误:使用pe.toString()获取的是EditText对象的字符串表示,而非用户输入的文本,正确写法应为pe.text.toString()。
  • EMI计算时机错误:计算逻辑在Activity创建时就执行了,而非点击按钮时,此时用户还未输入数据,必然触发格式转换异常。
  • 错误处理位置不当:try-catch块包裹了初始化代码,而非按钮点击时的输入解析与计算逻辑。
  • 错误提示过于笼统:Toast仅显示"Error occurred",无法告知用户具体问题(如输入无效)。
  • 未处理除零异常:当期限为0时,公式分母会变为0,引发算术异常。
  • 结果未格式化:直接将double转为字符串显示,结果不够美观(应保留两位小数)。

修复后的完整代码:

import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlin.math.pow
import java.text.DecimalFormat

class EMIPayment : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_emipayment)
        
        title = "EMI Payment"
        supportActionBar?.setBackgroundDrawable(
            ColorDrawable(Color.parseColor("#3F51B5"))
        )

        // 提前获取控件引用
        val calculateEMI = findViewById<Button>(R.id.calculateEMI)
        val emiView = findViewById<TextView>(R.id.EMIView)
        val loanAmountEt = findViewById<EditText>(R.id.loanAmount)
        val tenureEt = findViewById<EditText>(R.id.tenure)
        val decimalFormat = DecimalFormat("#.##") // 格式化结果为两位小数

        calculateEMI.setOnClickListener {
            try {
                // 点击按钮时才获取并转换用户输入
                val loanAmount = loanAmountEt.text.toString().toDouble()
                val tenure = tenureEt.text.toString().toDouble()
                val ratePerMonth = 0.01717

                // 检查期限有效性,避免除零
                if (tenure <= 0) {
                    Toast.makeText(this, "请输入有效的期限(大于0)", Toast.LENGTH_SHORT).show()
                    return@setOnClickListener
                }

                // 计算EMI
                val compoundFactor = (1 + ratePerMonth).pow(tenure)
                val emi = (loanAmount * ratePerMonth * compoundFactor) / (compoundFactor - 1)
                
                // 格式化并显示结果
                emiView.text = decimalFormat.format(emi)
            } catch (e: NumberFormatException) {
                Toast.makeText(this, "请输入有效的数字", Toast.LENGTH_SHORT).show()
            } catch (e: ArithmeticException) {
                Toast.makeText(this, "计算出错,请检查输入", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

主要修复点说明:

  1. 修正EditText值获取:使用loanAmountEt.text.toString()获取用户输入的文本内容。
  2. 调整计算时机:将EMI计算逻辑移至按钮点击事件内部,确保只有用户点击后才处理输入。
  3. 优化错误处理:在点击事件内包裹try-catch,针对不同异常给出明确提示,并增加期限为0的判断。
  4. 格式化结果:使用DecimalFormat将EMI结果格式化为两位小数,符合货币显示习惯。
  5. 变量命名优化:将pe、ne改为更具可读性的loanAmountEt、tenureEt,提升代码维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:30:40