java - 致命异常 : java. util.UnknownFormatConversionException 转换 = 'End of String'

标签 java android kotlin exception

尝试在应用中显示有关通知的信息,偶尔会出现错误:

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>

...并且 app_name_timestamp 的 XML 定义由以下类执行:

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 ・ 20m”

同样,我正在尝试破译错误。我已经完成了各种测试,例如在第二个和第三个参数中对空字符串进行硬编码,但到目前为止没有产生相同的错误。

作为我接受的答案——“在这里您可以获得有关此异常的具体信息”。关于查找位置的指针。

最佳答案

我找到了这个问题的答案,这完全是开发人员的错误(但这里有一些东西需要学习)。一个简短的解释:在 Android 中,每种语言都有多个字符串 xml 文件——其中一个字符串“%s ・ %s”在翻译过程中被破坏,变成了“%s ・ %”——所以在字段应用程序只会为受影响的翻译显示此错误。学习是,在 String.format 中,如果没有匹配数量的字符串模板,则会出现“字符串结尾”异常。

关于java - 致命异常 : java. util.UnknownFormatConversionException 转换 = 'End of String',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61673134/

相关文章:

java - 使用 UTF-8 时,为什么 equalsIgnoreCase() 对字母 æ、ø、å 失败?

java - CXF 的 JAXB 模式验证错误 - 发生 JAXBException : cvc-elt. 1:找不到元素的声明

java - 计算数据库中的值

java - 在 libgdx 中绘制渐变的子集

java - 区分OnDismiss和dialogfragment的方法 - Android Studio

java - 尝试从距离矩阵 api 获取距离数据总是返回 NULL

android - 恢复应用程序时如何禁用DialogFragment过渡动画?

java - 修复 sdkmanager java.lang.NoClassDefFoundError 批处理文件

android - fragment/Activity 生命周期和方向变化

android - 如何将 Kotlin 错误链接到 Android Studio 中的源代码?