【问题标题】:Fatal Exception: java.util.UnknownFormatConversionException Conversion = 'End of String'致命异常:java.util.UnknownFormatConversionException Conversion = 'End of String'
【发布时间】:2020-08-23 15:43:11
【问题描述】:

尝试在应用中显示通知信息,偶尔会报错:

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”

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

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

【问题讨论】:

  • 你能提供更多细节,或者更好地发布完整的类文件和字符串文件,你是如何创建字符串的,比如 test. 和哪一行你得到异常
  • 类文件和XML字符串定义添加
  • 我有一个疑问,当你调用 getString 时,它让你设置参数如果你格式化返回的字符串怎么办?我认为这将是一个有效的解决方案
  • @Alex Rivas 我不确定我是否遵循了您的建议,但是这组代码很少会产生错误/拒绝......可能是数百次。但是当您说“格式化返回的字符串”时,您指的是getString的结果吗?
  • 我继承了这段代码,当我查看 app_name_timestamp 的 getString 时,每种语言的字符串文件中都有副本......但它们都完全相同......"%s·%s “我可以硬编码它。但我还是想知道这个错误是什么意思...

标签: java android kotlin exception


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您似乎没有初始化appNameAndTime 字符串。你必须做类似的事情

    appNameAndTime = getString(R.string.app_name_timestamp)
    

    并通过从该字符串中删除格式化属性来尝试此操作

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

    【讨论】:

    • 第一个建议您似乎认为有一些时间问题?至于你的两个想法——你知道“字符串结束”这个消息是什么意思吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2022-11-30
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多