通过检查EditText是否为空来阻止应用崩溃

时间:2018-10-06 13:05:45

标签: android kotlin

所以我用2个EditText输入制作了一个计算器,但是当2个字段为空时,我无法阻止应用程序崩溃。我找到了一些针对Text类型的EditText的解决方案,但由于我使用的是数字EditText,因此被卡在此处。 下面是代码:  {

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
}

}

2 个答案:

答案 0 :(得分:0)

您需要先检查editText是否为空。

//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
 }
}

执行以上操作检查所有功能。

答案 1 :(得分:0)

您可能会收到的错误是NumberFormatException。这是因为(“”!= [0-9] +)&&值的值! Int.MIN_VALUE。

您有三个选择:

  1. 首先检查它是否为空,如sandip所述。
  2. 使用toIntOrNull
  3. 捕获异常。
如果int无效,则

toInt会引发异常(NumberFormatException)。这意味着:

  1. 不是定义了基数的数字(默认为10;实际的整数,即16为十六进制,但此处不适用)
  2. 数字太大或太小(小于Int.MIN_VALUE或大于Int.MAX_VALUE)。
  3. 字符串为空。

首先检查是否为空可以解决一半的问题;如果为空,则无效。但是,如果有字母或数字太大,则无法解决。

您可以为此使用toIntOrNull()。就像toInt()一样,但是如果转换失败,它将返回null。您可以将Elvis运算符与run块一起使用,或者仅使用简单的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在这里做什么,请查看this question。您也可以完全摆脱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())体积更大,但这是一个选择。