Остановка приложения от сбоя путем проверки, является ли EditText пустым - PullRequest
0 голосов
/ 06 октября 2018

Итак, я сделал калькулятор с 2 входами EditText, но не смог остановить сбой приложения, когда 2 поля пусты.Я нашел некоторые решения для EditText типа Text, но я застрял здесь, потому что я использую Number 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 голосов
/ 06 октября 2018

Ошибка, которую вы, вероятно, получаете, это NumberFormatException.Это потому, что (""! = [0-9] +) && value value! Int.MIN_VALUE.

У вас есть три варианта:

  1. Сначала проверьте, пусто ли оно, как уже упоминалось в sandip.
  2. Используйте toIntOrNull
  3. Поймать исключение.

toInt генерирует исключение (NumberFormatException), если int недопустим.Это означает:

  1. Не число с заданным основанием (по умолчанию 10; фактическое целое число, т. Е. 16 - шестнадцатеричное, но здесь оно неприменимо)
  2. Число слишком большое илислишком маленький (в Int.MIN_VALUE или в Int.MAX_VALUE).
  3. Строка пуста.

Проверка, пусто ли, сначала решает половину проблемы;оно не может быть действительным, если оно пустое.Однако, это не решает проблему, если есть буквы или число слишком велико.

Вы можете использовать toIntOrNull() для этого.Это похоже на toInt(), но оно возвращает ноль, если преобразование не выполняется.Вы можете использовать оператор elvis с блоком run или просто использовать простой оператор if, чтобы проверить, является ли он пустым, и соответствующим образом решить проблемы.

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 и назначить числовое значение, просто сделайте его пустым и обработайте его позже, или что-то еще.

Максимальное положительное значение типа int составляет около 2,4 млрд.Если вы ожидаете числа с более высоким входным значением, используйте 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()), но это вариант.

0 голосов
/ 06 октября 2018

Вам нужно сначала проверить текст редактирования пустым или нет.

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

Выполните вышеуказанную проверку всех ваших функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...