所以我做了一个带有 2 个 EditText 输入的计算器,但是当 2 个字段为空时,我无法阻止应用程序崩溃。我为文本类型的编辑文本找到了一些解决方案,但由于我使用的是数字编辑文本而卡在这里。 顺便说一下,这是代码: {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun buPlusClick(view: View){
var num1:Int=ednum1.text.toString().toInt()
var num2:Int=ednum2.text.toString().toInt()
var result = num1+num2
val resultprint = "The result Is : $result"
tvresult.text=resultprint
}
}
您可能会遇到的错误是 NumberFormatException。这是因为 (" != [0-9]+( && value value !
您有三种选择:
- 正如桑迪普提到的,首先检查它是否为空。
- 使用
toIntOrNull
- 捕获异常。
toInt
如果 int 无效,则会引发异常 (NumberFormatException(。这意味着:
- 不是具有定义基数的数字(默认为 10;实际的整数,即 16 是十六进制,但在这里不适用(
- 数字太大或太小(低于 Int.MIN_VALUE 或高于 Int.MAX_VALUE(。
- 字符串为空。
首先检查它是否为空可以解决一半的问题;如果它是空的,它就无效。但是,如果有字母或数字太大,则无法解决。
您可以使用toIntOrNull()
执行此操作。它就像toInt()
一样,但如果转换失败,它会返回 null。您可以将 elvis 运算符与运行块一起使用,或者只使用简单的 if 语句来检查它是否为 null,并相应地处理问题。
val num1: Int = ednum1.text.toString().toIntOrNull() ?: run {
// Notify the user the first number is invalid
return; // return from the method to avoid NPE's
}
val num2: Int = ednum2.text.toString().toIntOrNull() ?: run {
// Notify the user the second number is invalid
return;
}
如果你不明白run
在这里做什么,看看这个问题。您也可以完全摆脱run
并分配一个数字值,只需让它为 null 并稍后处理它,或者其他什么。
int 的最大正值约为 24 亿。如果您期望输入的数字高于此值,请使用Long
,等效地toLongOrNull()
。
最后一个选项是捕获错误。
var num1: Int? = try { ednum1.text.toString().toInt() } catch (e: NumberFormatException) {
// You can do a lot of stuff in here; you can notify the user and `return` from the method,
// set it to null and handle it later, or assign an integer value.
null
}
var num2: Int? = try { ednum2.text.toString().toInt() } catch (e: NumberFormatException) {
// see my comments on the first block; same applies here
null
}
在我看来,它比toIntOrNull()
(/toLongOrNull()
(略大,但它是一种选择。
您需要检查第一个编辑文本是否为空。
//Java
private boolean isEmpty(EditText editText) {
if (editText.getText().toString().trim().length() > 0)
return false;
return true;
}
//kotlin
private fun isEmpty(editText: EditText): Boolean {
return if (editText.text.toString().trim { it <= ' ' }.length > 0) false else true
}
然后执行以下代码:
fun buPlusClick(view: View){
if(!isEmpty(ednum1) && !isEmpty(ednum2)) {
var num1:Int=ednum1.text.toString().toInt()
var num2:Int=ednum2.text.toString().toInt()
var result = num1+num2
val resultprint = "The result Is : $result"
tvresult.text=resultprint
}
}
执行上述操作,检查所有功能。