Kotlin try-catch возобновляется после перехвата

#android #sockets #kotlin #try-catch

#Android #сокеты #kotlin #try -catch

Вопрос:

Я не хочу продолжать код (который открывает новое действие), если генерируется исключение (если ввод пустой или недопустимый). Но даже если я не ввожу все, он выполняет это так, как будто ничего не произошло. Ошибка поджарена, поэтому она ее улавливает.

 try {
        val ip1: String = ip_addr1.text.toString()
        val port1: String = port1.text.toString()
        val ip2: String = ip_addr2.text.toString()
        val port2: String = port2.text.toString()

        // Bind to MyService
        Intent(this, MyService::class.java).also { intent ->
            intent.putExtra("ip1", ip1)
            intent.putExtra("port1", port1)
            intent.putExtra("ip2", ip2)
            intent.putExtra("port2", port2)
            bindService(intent, connection, Context.BIND_AUTO_CREATE)
        }

        val intent = Intent(this, HomeActivity::class.java)
        startActivity(intent)

    } catch (e: NumberFormatException) {
        showToast("Enter IP in Port")
    } catch (e: Exception) {
        showToast(e.toString())
    }
}
  

Комментарии:

1. Если это в функции, которую вы не хотите продолжать, поместите return внутри блока catch .

2. Также актуально. По словам разработчиков языка Kotlin, try / catch — это запах кода, если он не находится в служебной функции низкого уровня, которую вы создали, поэтому вам не нужно использовать ее в общем коде приложения. medium.com/@elizarov/kotlin-and-exceptions-8062f589d07

Ответ №1:

У вас есть редактировать тексты и получать текст из них, вы не преобразуете ни один из них в числа, поэтому нет исключения из формата чисел для перехвата. Пустой текст редактирования имеет допустимый текст строки как ничто "" , затем вы добавляете его дополнительно.

Если вы хотите иметь числовое значение, то это вызовет try catch

 val ip1 = Integer.parseValue(ip_addr1.text.toString())

//same parsing for the others


Intent(this, MyService::class.java).also { intent ->
            intent.putIntExtra("ip1", ip1)
            //same for the others

...
  

Комментарии:

1. Но в Котлине toIntOrNull() это был бы предпочтительный способ сделать это.

2. Я думаю, что мне нужны IP-адреса в виде строк, что-то вроде 127.0.0.1, я думаю, не может быть представлено в виде числа.

3. Это не число, проблема с этим все еще остается в моем ответе, зачем пытаться / ловить, нечего ловить, если вы используете strings @GeoCap

4. Да, я думаю, мне нужно будет использовать что-то еще, кроме try / catch, спасибо за разъяснение