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() } } } }
主要修复点说明:
- 修正EditText值获取:使用
loanAmountEt.text.toString()获取用户输入的文本内容。 - 调整计算时机:将EMI计算逻辑移至按钮点击事件内部,确保只有用户点击后才处理输入。
- 优化错误处理:在点击事件内包裹try-catch,针对不同异常给出明确提示,并增加期限为0的判断。
- 格式化结果:使用
DecimalFormat将EMI结果格式化为两位小数,符合货币显示习惯。 - 变量命名优化:将
pe、ne改为更具可读性的loanAmountEt、tenureEt,提升代码维护性。
内容的提问来源于stack exchange,提问作者Dev_chaitanya
相关产品推荐
相关产品推荐

