致命异常:java.util.UnknownFormatConversionException Conversion = 'End of String'



试图在应用程序中显示有关通知的信息,偶尔会收到错误:

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中,如果没有匹配数量的字符串模板,则会出现"字符串末尾"异常。

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

appNameAndTime = getString(R.string.app_name_timestamp)

并尝试从这个字符串中删除格式化的属性

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

相关内容

最新更新