java.lang.NumberFormatException:对于输入字符串:“某事”

Posted

技术标签:

【中文标题】java.lang.NumberFormatException:对于输入字符串:“某事”【英文标题】:java.lang.NumberFormatException: For input string:"something" 【发布时间】:2021-12-11 15:03:10 【问题描述】:

我试图将一个字符串拆分为两个变量,一个是字符串,一个是 Long。它工作,当我记录它我可以看到它,我可以将它插入房间数据库,但我不知道为什么 "sometime" 我得到这个错误。 像这样的字符串

m8fw5sMdAcaX4Ezv7vzImeRAjkq2_1635234951781
java.lang.NumberFormatException: For input string: "m8fw5sMdAcaX4Ezv7vzImeRAjkq2"
        at java.lang.Long.parseLong(Long.java:594)
        at java.lang.Long.parseLong(Long.java:636)
        at com.animals.snowy.MainActivity$insertMessage$1$messageListener$1.onChildAdded(MainActivity.kt:88)

我的模特

@IgnoreExtraProperties
@Entity(tableName = "message_table")
data class MessageModel(
    @NonNull
    @PrimaryKey
    var messageId: String = "",
    var messageType: String? = null,
    var messageTimestamp: Long? = null,
    var messageData: String? = null,
    var messageSenderId: String? = null,
    var roomId: String = "",
    var isSeen: Boolean = false,
var uploadSuccess : Boolean = false
) : Serializable 

这是我的代码,我想获取朋友的新消息,所以我从房间数据库中获取列表朋友并使用 for 循环获取 roomId(我和我朋友的子容器消息的名称)。

private fun insertMessage() 
        viewModel.readRoomIdFriendsDAO().observe(this,  listRoomId ->
            if (listRoomId != null && listRoomId.isNotEmpty()) 
                for (item in listRoomId) 
                    val messageListener = object : ChildEventListener 
                        override fun onChildAdded(snapshot:DataSnapshot,previousChildName: String?) 

                            val messageModel: MessageModel? =
                                snapshot.getValue(MessageModel::class.java)
                            if (messageModel != null) 
                                messageModel.messageId = snapshot.key.toString().trim()
                                messageModel.roomId = item
                                messageModel.uploadSuccess = true
                                val listTemp = messageModel.messageId.split("_")
                                messageModel.messageSenderId = listTemp[0]
                                messageModel.messageTimestamp = listTemp[1].trim().toLong()
                                Log.e(TAG,"senderId: $messageModel.messageSenderId")
                                Log.e(TAG,"timestamp: $messageModel.messageTimestamp")
//                                messageViewModel.insertMessageDAO(messageModel)
                            
                        
                        override fun onChildChanged(
                            snapshot: DataSnapshot,
                            previousChildName: String?
                        ) 

                        
                        override fun onChildRemoved(snapshot: DataSnapshot) 

                        

                        override fun onChildMoved(
                            snapshot: DataSnapshot,
                            previousChildName: String?
                        ) 
                            TODO("Not yet implemented")
                        

                        override fun onCancelled(error: DatabaseError) 
                            TODO("Not yet implemented")
                        
                    
                    messageRef
                        .child(item)
                        .addChildEventListener(messageListener)
                
            
        )
    

【问题讨论】:

您确定格式始终受到尊重吗?字符串可能有 2 个_s 或类似的东西吗? 显然它并不总是采用您怀疑的格式。我建议在创建 listTemp 之后立即创建一个日志以查看它包含的内容,然后再执行 toLong(),因为那是发生崩溃的地方 我正在尝试,但非常感谢 【参考方案1】:

每当编译器尝试将无效输入类型强制转换为数字时,就会抛出java.lang.NumberFormatException

例如:

String validInputToCast = "123456789";
Long validInputToCast = validInputToCast.toLong(); // this casting will succeed.

String invalidInputToCast = "abce124";
Long invalidCastedInput = inputToCast.toLong(); // compiler will throw number exception on this line.

尝试调试下面的行,希望你能找到错误。

messageModel.messageTimestamp = listTemp[1].trim().toLong()

【讨论】:

以上是关于java.lang.NumberFormatException:对于输入字符串:“某事”的主要内容,如果未能解决你的问题,请参考以下文章