исключение java.lang.NumberFormatException: Для входной строки:»что-то»

# #android #firebase #kotlin #firebase-realtime-database #android-room

Вопрос:

я попытался разделить строку на две переменные, одна из которых строковая, а другая длинная. это работает, когда я регистрирую его, я вижу его и могу вставить в базу данных, но я не знаю, почему «когда-нибудь» я получаю эту ошибку. строка выглядит так

 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 для получения идентификатора комнаты(имя дочернего контейнерного сообщения меня и моего друга).

 private fun insertMessage() {  viewModel.readRoomIdFriendsDAO().observe(this, { listRoomId -gt;  if (listRoomId != null amp;amp; 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)  }  }  })  }   

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

1. Вы уверены, что этот формат всегда соблюдается? Может ли строка иметь 2 _ секунды или что-то в этом роде?

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

3. я пытаюсь , но большое спасибо

Ответ №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()