«kotlin» — интересное java.lang.NumberFormatException: неверная длинная ошибка

В том же приложении я использую следующие функции для обработки пользовательского ввода. Первый работает без проблем, а второй выдает исключение. Что мне не хватает?

Это вывод logcat:

Process: com.example.barkod okuyucu, PID: 9955
java.lang.NumberFormatException: Invalid long: "9786257901444"
at java.lang.Long.invalidLong(Long.java:124)
at java.lang.Long.parse(Long.java:361)
at java.lang.Long.parseLong(Long.java:352)
at java.lang.Long.parseLong(Long.java:318)

MainActivity2.kt (работает без ошибок):

var barkod = intent.getStringExtra("m1")
binding.textView2.text = barkod.toString()
val context = this
var db = DataBaseHelper(context)
binding.button2.setOnClickListener {
    var etadi = binding.editTextText.text
    var etsnkullanmatrh = binding.editTextNumber.text
    var etadet = binding.editTextNumber2.text
    var etbarkod = binding.textView2.text
    if (etadi.isNotEmpty() && etsnkullanmatrh.isNotEmpty()) {
        var kullanici = Kullanici(etadi, etbarkod.toLong(), etsnkullanmatrh.toInt(), etadet.toInt())
        db.insertData(kullanici)
    } else {
        Toast.makeText(applicationContext, "lutfen", Toast.LENGTH_LONG).show()
    }
}

MainActivity3.kt (выдает ошибку):

var barkod = intent.getStringExtra("n1")
binding.textView3.text = barkod
val context = this
var db = DataBaseHelper(context)
binding.button3.setOnClickListener {
    var etadi = binding.editTextText2.text
    var etsnkullanmatrh = binding.textView5.text
    var etadet = binding.editTextNumber4.text
    var etbarkod = binding.textView3.text
    if (etadi.isNotEmpty() && etsnkullanmatrh.isNotEmpty()) {
        var kullanici = Kullanici(etadi, etbarkod.toLong(), etsnkullanmatrh.toInt(), etadet.toInt())
        db.insertData(kullanici)
    } else {
        Toast.makeText(applicationContext, "lutfen", Toast.LENGTH_LONG).show()
    }
}

Публикуя код, отформатируйте его правильно, следуя рекомендациям по отступам из Руководства по стилю Android, чтобы люди могли лучше понять ваш код и ваш вопрос. В противном случае им будет сложно вам ответить. Кроме того, публикуя два примера кода, которые выглядят почти одинаково, объясните, в чем заключаются существенные различия. В этом случае строка, по которой вы вызываете toLong(), недействительна. Проверьте точное содержимое строки, особенно если она содержит пробелы.

k314159 01.03.2024 13:22

я понимаю, приму к сведению. к тому же коды уже те же самые. Я спрашиваю, почему он делает ошибки на другом, когда уже работает на одном.

Sezar 01.03.2024 13:43

Судя по журналу, после числа есть новая строка. Функция toLong() не принимает символы новой строки, только цифры. Но я не уверен, почему один фрагмент кода работает, а другой нет.

k314159 01.03.2024 13:46

Пара вещей: используйте правильное форматирование кода (просто нажмите Ctrl+L в Android Studio, и он сделает это за вас). Это помогает вам во многих случаях, поскольку правильно визуализирует поток управления. Кроме того, по возможности используйте val вместо var, поскольку это предотвращает случайное изменение ваших данных, если вы не собираетесь их изменять.

vatbub 01.03.2024 14:16

Наконец, на ваш вопрос: я пытался воспроизвести его с помощью предоставленной вами входной строки, но не могу воспроизвести исключение. Поэтому, пожалуйста, отредактируйте свой вопрос и включите подробную информацию о том, что вы делали в приложении, чтобы вызвать исключение (вы нажимали Enter на клавиатуре?) Альтернативно, установите точку останова на строке, которая вызывает исключение, и посмотрите на строку в отладчике. Содержит ли он невидимые символы?

vatbub 01.03.2024 14:16

@vatbub в исходном журнале выглядело так, как будто после числовой строки была новая строка, что, вероятно, и вызвало ошибку. К сожалению, вы отредактировали вопрос и удалили эту новую строку.

k314159 01.03.2024 14:17

@ k314159 Не стесняйтесь просматривать историю изменений. Я старался не редактировать вывод logcat, а только код Kotlin и описание вокруг него. Я даже скопировал строку, упомянутую в выводе logcat, перед редактированием вопроса, чтобы убедиться, что в ней нет странного символа, но все равно не смог воспроизвести исключение.

vatbub 01.03.2024 14:27

@ k314159 Согласно истории изменений, новая строка была отредактирована самим Сезаром.

vatbub 01.03.2024 14:29

@k314159 И это также объясняет, почему я больше не могу это воспроизвести...

vatbub 01.03.2024 14:31

@k314159 k314159 я сделал это. Спасибо за Ваш интерес.

Sezar 01.03.2024 17:30

@vatbub я сделал это. Спасибо за Ваш интерес.

Sezar 01.03.2024 17:30
1
11
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

var kullanici = Kullanici(
    etadi, 
    etbarkod.trim().toLong(), 
    etsnkullanmatrh.trim().toInt(), 
    etadet.trim().toInt())

Я поступил с этим очень похоже на ваш. Спасибо за Ваш интерес.

Sezar 01.03.2024 17:27

Другие вопросы по теме