#android #android-studio #kotlin #android-room
Вопрос:
Мне нужно ввести несколько значений в базу данных комнат. Для этого мне нужно преобразовать все, что вводит пользователь, в Двойное и Длинное. По какой-то причине приложение вылетает каждый раз, когда я пытаюсь это сделать. Я совершенно уверен , что проблема в двух переменных, отмеченных //Need to fix
, потому что я попытался инициализировать их до 0, и после этого приложение работает нормально. Я буду рад предоставить любую дополнительную информацию, если это необходимо. В чем здесь может быть проблема?
Это и есть код:
override fun onResume() {
super.onResume()
var transacType = false
var transacAmount = binding.amountInput.text.toString().toDouble() //Need to fix
var transacDate: Long = binding.pickedDate.text.toString().toLong() //Need to fix
var transacCategory: String = "N"
val duration = Toast.LENGTH_SHORT
...
binding.floatingActionButton.setOnClickListener{
if (transacCategory == "N" || transacCategory == "Pick a category…" amp;amp; binding.spinner2.isVisible) {
val text = "Please pick a category!"
val toast = Toast.makeText(applicationContext, text, duration)
toast.show()
} else if (transacAmount == 0.0) {
val text = "Please input an amount!"
val toast = Toast.makeText(applicationContext, text, duration)
toast.show()
} else {
val transaction = Transactions(0L, transacType, transacAmount, transacDate, transacCategory)
transactionViewModel.insert(transaction)
}
}
Я не уверен, что это необходимо, но это все красные вещи в журнале, которые я не знаю, как читать:
2021-04-02 17:25:54.438 22619-22619/com.example.budgie E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.budgie, PID: 22619
java.lang.RuntimeException: Unable to resume activity {com.example.budgie/com.example.budgie.AddTransactionActivity}: java.lang.NumberFormatException: empty String
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4789)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4832)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:190)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:105)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
Caused by: java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at com.example.budgie.AddTransactionActivity.onResume(AddTransactionActivity.kt:72)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1465)
at android.app.Activity.performResume(Activity.java:8223)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4779)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4832)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:190)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:105)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
пс. Я знаю, что в моем коде, вероятно, есть и другие проблемы, но сейчас я пытаюсь решить только эту.
PSS. Я довольно новенькая, полегче со мной, ладно?
Ответ №1:
Вы уже получили ответ, но просто для того, чтобы объяснить, откуда люди знают (чтобы вы тоже могли расследовать тайны)…
Красный текст в журнале — это трассировка стека-он печатается, когда вы получаете исключение (своего рода ошибку), из-за которого приложение выходит из строя, и показывает, на какой строке оно произошло, цепочку методов, которые привели к нему, и что вызвало сбой. Таким образом, вы получите представление о том, что происходило и где вам нужно искать!
Он разбит на блоки, первый начинается с
java.lang.RuntimeException: Unable to resume activity [...]
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4789)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4832)
...
таким образом, ваше приложение разбилось с a RuntimeException
, и содержащееся в нем сообщение (в основном объяснение) «не удается возобновить активность». В следующей строке говорится , что исключение было выдано в строке 4789 из ActivityThread.java
, в performResumeActivity()
, и вы попали туда из строки 4832 из handleResumeActivity()
того же файла и т. Д…
Иногда это полезно, в данном случае это все внутренние вещи Android, которые вы не писали, поэтому давайте посмотрим на следующий блок, который является исключением, которое было выброшено, что заставило performResumeActivity
отказаться и выбросить свое исключение:
Caused by: java.lang.NumberFormatException: For input string: "com.google.android.material.textfield.TextInputEditText{64a283 VFED..CL. ......I. 0,0-0,0 #7f09004a app:id/amount_input}"
Та же сделка, что и раньше, но нам не нужно заглядывать глубже — у нас есть вся необходимая информация прямо здесь! Это NumberFormatException
вызвало внешний RuntimeException
сбой приложения. NumberFormatException
s обычно отображаются, когда вы пытаетесь прочитать какой — то текст в виде числа, но он не соответствует законному формату-и он сообщает вам строку ввода, которая вызвала его, что определенно не может быть прочитано как число!
Если вы посмотрите на дорожку стека в этом блоке, вы дойдете до этого фрагмента:
at java.lang.Double.parseDouble(Double.java:538)
at com.example.budgie.AddTransactionActivity.onResume(AddTransactionActivity.kt:72)
это говорит вам о том , что parseDouble()
вызываемый вызов вызывается в строке 72 AddTransactionActivity
, которая в основном указывает на то, где проблема (или начинается) в вашем собственном коде. (Это помогает сканировать трассировку до тех пор, пока вы не обнаружите com.example.budgie
или как там называется ваш пакет, чтобы вы могли найти, где задействован ваш фактический код.)
Так что, даже если вы точно не знаете, почему это неправильно, вы знаете, на что смотреть! И вы знаете , что передаете неправильную входную строку — в ней должно быть число TextView
, но вместо этого там что-то есть. Возможно, вы не узнаете, что все это такое, но, надеюсь, вы увидите TextView
там «» и поймете, что TextView
сам по себе каким-то образом участвует, и вы не получаете текстовое содержимое. А потом вы можете пойти и разобраться в этом, посмотреть, правильно ли вы это делаете…
Не волнуйся, эта textView.text
штука тоже все время выводит меня из себя. И да, входная строка печатается в первой строке трассировки стека ( RuntimeException
выводится сообщение о ее причине), но я хотел показать, что вы можете просмотреть каждый блок отдельно и прочитать трассировку, чтобы узнать, где именно что-то произошло
Надеюсь, это поможет вам или кому-то еще!
Комментарии:
1. Большое вам спасибо! Это помогло мне понять, как найти проблему и идентифицировать ее, и после добавления
.text
в начальное объявление этих переменных трассировка стека изменилась. Теперь там написаноCaused by: java.lang.NumberFormatException: empty String
. По крайней мере, я чего-то добиваюсь!2. Ну, надеюсь, это более очевидно 😉 В Kotlin есть множество
...OrNull
функций, напримерtoDoubleOrNull
, которые выдаютnull
значение вместо того, чтобы создавать исключение, поэтому вы можете таким образом справляться с ошибками. Ваша более широкая проблема здесь заключается в том, что вы начинаете без данных в полях ввода, поэтому вам нужно решить, как справиться с этой ситуацией. Я бы рекомендовал какую-нибудь функцию валидатора, проверяющую, что введенные пользователем данные, которые вы действительно можете использовать, прежде чем пытаться что-либо с ними сделать! Таким образом, вы справляетесь с запуском, а также с будущими махинациями
Ответ №2:
binding.amountInput
это тип редактируемого текста, и вы пытаетесь выполнить toString() для редактируемого текста, а не для текста внутри редактируемого текста. Поскольку это тип объекта, toString просто выводит свой тип, который com.google.android.material.textfield.TextInputEditText
затем пытается преобразовать эту строку в число, и это вызывает исключение. Что вам нужно сделать, так это: var transacAmount = binding.amountInput.text.toString().toDouble()
Комментарии:
1. Хорошо, я исправил эту часть кода, но по какой-то причине он все еще выходит из строя, когда должен открыться экран, на котором находится редактируемый текст. Тем не менее, спасибо вам за помощь.