致命异常:java.util.UnknownFormatConversionException转换=';字符串末尾';

致命异常:java.util.UnknownFormatConversionException转换=';字符串末尾';,java,android,kotlin,exception,Java,Android,Kotlin,Exception,正在尝试在应用程序中显示有关通知的信息,偶尔会出现以下错误: Fatal Exception: java.util.UnknownFormatConversionException Conversion = 'End of String' 这是一个难题,但我觉得如果我能理解“字符串结束”的含义,我就会上路了。下面是抛出错误的代码 class NotificationsListItemViewHolder( itemView: View, private val

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

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代码中)

这里是创建格式字符串的地方

<string name="app_name_timestamp" formatted="false">%s ・ %s</string>
s%s
…并且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)
        }
    }
类通知适配器(
val数据:MutableList=mutableListOf(),
私有val侦听器:(NotificationInfo,Int,Boolean,Boolean)->Unit
):RecyclerView.Adapter(){
重写CreateViewHolder(父级:ViewGroup,viewType:Int):NotificationsListItemViewHolder{
val itemView=LayoutInflater.from(parent.context)。充气(R.layout.view\u通知,parent,false)
返回NotificationsListItemViewHolder(itemView,parent.context.resources.getString(R.string.app_name_timestamp)){notificationInfo,position,longClick,Disclose->
侦听器(通知信息、位置、长单击、解除)
}
}
String.format的模板是第一个参数(以AppName和Time的形式传递到函数中)始终为:“%s@%s”,除了一些罕见的崩溃外,其他两个参数在显示时的格式为:“Twitter@20m”

再一次,我试图破译错误。我做过各种测试,比如在第二个和第三个参数中硬编码空字符串,但到目前为止没有任何东西产生相同的错误


作为一个回答,我愿意接受--“这里是您可以获取有关此异常的特定信息的地方”。一个指向查找位置的指针。

您似乎没有初始化AppName和Time字符串。您必须执行以下操作

appNameAndTime = getString(R.string.app_name_timestamp)
并尝试从该字符串中删除格式化属性

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

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

您能提供更多详细信息吗,或者更好地发布完整的类文件和字符串文件中您是如何创建字符串的一些东西,比如这个测试。在哪一行您将获得异常类文件和XML字符串定义。当您调用getString时,我有一个疑问,让您设置参数。如果您格式化ret字符串,该怎么办urned?我想这是个合理的解释solution@AlexRivas我不确定我是否遵循了你的建议,但这组代码只会偶尔产生错误/拒绝…可能是数百万次中的几百次。但是当你说“格式化重新处理的字符串”您是指getString的结果吗?我继承了这段代码,当我查看app_name_timestamp的getString时,字符串文件中有每种语言的副本…但它们都完全相同…%s‑%s”我可以把它硬编码。但我还是想知道错误的意思…第一个建议似乎是你认为有时间问题?至于你的两个想法——你知道“字符串结束”的意思吗?
<string name="app_name_timestamp" formatted="false">%s ・ %s</string>