Android 将字符串转换为Int时尝试捕获中的NumberFormatException

Android 将字符串转换为Int时尝试捕获中的NumberFormatException,android,kotlin,try-catch,numberformatexception,Android,Kotlin,Try Catch,Numberformatexception,我正在尝试在try-catch块中将字符串转换为Int。在我的例子中,如果单击按钮,textview中的数字将从字符串转换为Int。当我使用OnclickListener时,它可以工作,我甚至不需要使用try-catch。但对于OnkeyListener,我得到了“numberformatexception:invalid int”错误。 我甚至试着用try-catch。但它仍然向我显示了这个错误。我真的不明白为什么它适用于OnClickListener,但不适用于OnKeyListener。这

我正在尝试在try-catch块中将字符串转换为Int。在我的例子中,如果单击按钮,textview中的数字将从字符串转换为Int。当我使用OnclickListener时,它可以工作,我甚至不需要使用try-catch。但对于OnkeyListener,我得到了“numberformatexception:invalid int”错误。 我甚至试着用try-catch。但它仍然向我显示了这个错误。我真的不明白为什么它适用于OnClickListener,但不适用于OnKeyListener。这是我的密码-

    var ID = findViewById<EditText>(R.id.edt_id)
    btn_add.setOnClickListener {
        val item=Item(
            Integer.parseInt(edt_id.text.toString()),
            Integer.parseInt(quan.toString()),
            edt_name.text.toString(),
            name.toString(),
            date_record.toString(),
            location_record.toString(),
            master_record.toString().toInt()
        )
        db.addItem(item)
        refreshData()

    edt_id.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->

        if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == 
    KeyEvent.ACTION_UP) {
            //Perform Code
            val ii:String = ID.text.toString()
            var id:Int = 0

            try {
                id = Integer.parseInt(ii)
                println(id!!)
                 Integer.parseInt(quan.toString())
                 Integer.parseInt(record_code.toString())
                println("GG")


            edt_id.text.toString()
                val item=Item(
                    id,
                    Integer.parseInt(quan.toString()),
                    edt_name.text.toString(),
                    name.toString(),
                    date_record.toString(),
                    location_record.toString(),
                    Integer.parseInt(record_code.toString())
                )
                db.addItem(item)
                refreshData()
                edt_id.text=null
                edt_id.requestFocus()                
                true}
        catch (nfe:NumberFormatException )
        { nfe.printStackTrace() }
            }
        false

    })
var ID=findViewById(R.ID.edt\u ID)
btn_add.setOnClickListener{
val项目=项目(
Integer.parseInt(edt_id.text.toString()),
Integer.parseInt(quan.toString()),
edt_name.text.toString(),
name.toString(),
日期\记录.toString(),
位置\记录.toString(),
主记录.toString().toInt()
)
db.附加项(项目)
刷新数据()
edt_id.setOnKeyListener(View.OnKeyListener{v,keyCode,event->
如果(keyCode==KeyEvent.keyCode_输入&&event.action==
KeyEvent.ACTION(启动){
//执行代码
val ii:String=ID.text.toString()
变量id:Int=0
试一试{
id=Integer.parseInt(ii)
println(id!!)
Integer.parseInt(quan.toString())
整数.parseInt(记录\代码.toString())
println(“GG”)
edt_id.text.toString()
val项目=项目(
身份证件
Integer.parseInt(quan.toString()),
edt_name.text.toString(),
name.toString(),
日期\记录.toString(),
位置\记录.toString(),
整数.parseInt(记录\代码.toString())
)
db.附加项(项目)
刷新数据()
edt_id.text=null
edt_id.requestFocus()
真的}
捕获(nfe:NumberFormatException)
{nfe.printStackTrace()}
}
假的
})

如果您正在使用Kotlin,最安全的方法是使用
toIntOrNull()
例如:

"10".toIntOrNull()
如果字符串不是数字,它将返回null。在此之后,您可以使用elvis运算符检查数字是否为null,然后返回另一个值:

val number = "ten".toIntOrNull() ?: 0 

// "ten" is non number, will return null instead, 
// then catch the null with elvis operator ?: and fall back to default value 0
您还可以使代码变得更简单,如:

    val item=Item(
        ID.text.toIntOrNull() ?: 0,
        quan.toString().toIntOrNull() ?: 0),
        edt_name.text.toString(),
        name.toString(),
        date_record.toString(),
        location_record.toString(),
        record_code.toString().toIntOrNull() ?: 0
    )
    db.addItem(item)
    refreshData()
    edt_id.text=null
    edt_id.requestFocus()                
    true

如果您使用的是Kotlin,最安全的方法是使用
toIntOrNull()
,例如:

"10".toIntOrNull()
如果字符串不是数字,它将返回null。在此之后,您可以使用elvis运算符检查数字是否为null,然后返回另一个值:

val number = "ten".toIntOrNull() ?: 0 

// "ten" is non number, will return null instead, 
// then catch the null with elvis operator ?: and fall back to default value 0
您还可以使代码变得更简单,如:

    val item=Item(
        ID.text.toIntOrNull() ?: 0,
        quan.toString().toIntOrNull() ?: 0),
        edt_name.text.toString(),
        name.toString(),
        date_record.toString(),
        location_record.toString(),
        record_code.toString().toIntOrNull() ?: 0
    )
    db.addItem(item)
    refreshData()
    edt_id.text=null
    edt_id.requestFocus()                
    true

很好,我加了一些例子,希望它能帮助你。很好,我加了一些例子,希望它能帮助你。