Неустранимое исключение: java .util.UnknownFormatConversionException Conversion = 'Конец строки' - PullRequest
2 голосов
/ 08 мая 2020

Пытаюсь отобразить в приложении информацию об уведомлениях и иногда получаю сообщение об ошибке:

Fatal Exception: java.util.UnknownFormatConversionException Conversion = 'End of String'

Это загадка, но я чувствую, если смогу понять, что означает «Конец строки», я быть в пути. Вот код, который выдает ошибку

class NotificationsListItemViewHolder(
        itemView: View,
        private val appNameAndTime: String,
        private val listener: (NotificationInfo, Int, Boolean, Boolean) -> Unit) : RecyclerView.ViewHolder(itemView) {


    var notificationInfo: NotificationInfo? = null

    fun bind(notification: NotificationInfo) {

        if(isIncludedPackage(notification.packageName))
        {
            applyAlternateTheme(itemView)
        }else {
            applyTheme(itemView)
        }
        notificationInfo = notification

        itemView.apply {
            appNameTime.text = String.format(appNameAndTime, notification.appName, getTimeAgo(System.currentTimeMillis(), notification.timestamp))
            title.text = notification.title
            body.text = notification.bodyText
            if (notification.smallIconPath != null) {
                Glide.with(this).load(notification.smallIconPath).into(appIcon)
                /*
                if (ThemeManager.currentTheme.dark) {
                    appIcon.setColorFilter(Color.WHITE)
                } else {
                    appIcon.setColorFilter(Color.BLACK)
                }

Следующая строка (из приведенного выше кода) - это место, где возникает фатальное исключение (ну, фактически в коде Java)

appNameTime.text = String.format(appNameAndTime, notification.appName, getTimeAgo(System.currentTimeMillis(), notification.timestamp))

Здесь создается строка формата

<string name="app_name_timestamp" formatted="false">%s ・ %s</string>

... и это XML определение app_name_timestamp приводится в исполнение следующим классом:

class NotificationsAdapter(
        val data: MutableList<NotificationInfo> = mutableListOf(),
        private val listener: (NotificationInfo, Int, Boolean, Boolean) -> Unit
) : RecyclerView.Adapter<NotificationsListItemViewHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotificationsListItemViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.view_notification, parent, false)
        return NotificationsListItemViewHolder(itemView, parent.context.resources.getString(R.string.app_name_timestamp)) {notificationInfo, position, longClick, dismiss ->
            listener(notificationInfo, position, longClick, dismiss)
        }
    }

Шаблон для String.format - это первый параметр (переданный в функцию как appNameAndTime) всегда: «% s ・% s» и, за исключением некоторых редких сбоев, предназначен для форматирования двух других параметров, чтобы они выглядели следующим образом при отображении: «Twitter ・ 20м "

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

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Я нашел ответ на это, и это полностью ошибка разработчика (но здесь есть чему поучиться). Краткое объяснение: в Android у вас есть несколько строковых xml файлов для каждого языка - и в одном из них строка «% s ・% s» была нарушена в процессе перевода и превратилась в «% s ・%» - - поэтому в поле приложение будет отображать эту ошибку только для затронутых переводов. Изучение состоит в том, что в String.format, если у вас нет подходящего количества строковых шаблонов, вы получите исключение «Конец строки».

0 голосов
/ 08 мая 2020

кажется, appNameAndTime строка, которую вы не инициализируете. вам нужно сделать что-то вроде

appNameAndTime = getString(R.string.app_name_timestamp)

и попробовать это также, удалив атрибут форматирования из этой строки

<string name="app_name_timestamp" formatted="false">%s ・ %s</string>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...