java - 更严格的 String.format 不会忽略额外的参数?

标签 java string string-formatting

Java的String.format静默忽略传递的额外参数,这些参数不在格式字符串中使用,但如果传递的参数较少或无效,则会失败。当传递更多参数时,有没有办法处理这种情况?

If there are more arguments than format specifiers, the extra arguments are ignored



https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.lang.String-java.lang.Object...-
private static void doStuff(Stuff stuff, String details, Object... args) {
    if(stuff.someCondition()) {
        try {
            details = String.format("Details: " + details, args);
        } catch (Exception ex) { //No Exception thrown when args are not used by
            String arguments = Arrays.stream(args)
                    .map(Objects::toString)
                    .collect(joining(";"));
            details = String.format("Details: %s Args: %s", details, arguments);
        }
    }
    stuff.process(details);
}

private static void foo() {
    Stuff stuff = new Stuff();
    doStuff(stuff, "blah blah %s ", "blah"); // No exception, works as expected
    doStuff(stuff, "blah blah %s %s", "blah"); // Fails as expected and args are printed
    doStuff(stuff, "blah blah %s", "blah", "blah"); // Silently ignores. How to handle this case?
}

最佳答案

采取不同的方法而不计算或解析 % .虽然不是一个有效的。

public static String safeFormat(String formatStr, Object... args) {
    List<Object> objects = Arrays.asList(args);
    // https://commons.apache.org/proper/commons-lang/javadocs/api-3.7/org/apache/commons/lang3/mutable/MutableBoolean.html
    MutableBoolean isCalled = new MutableBoolean(false);
    objects.add(new Object(){
        @Override
        public String toString() {
            isCalled.setTrue();
            return "";
        }
    });
    //noinspection ResultOfMethodCallIgnored
    String.format(formatStr+" %s", objects.toArray());
    if(isCalled.isFalse()) {
        throw new IllegalArgumentException("Not all arguments used by formatter");
    }

    return String.format(formatStr, args);
}

关于java - 更严格的 String.format 不会忽略额外的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48233220/

相关文章:

java - Java 回车符

java - Android 的 webview 显示空白屏幕

ruby - 如何从 Ruby 中的字符串中去除括号?

C#- ToLower() 有时会从字母 "I"中删除点

java - IBM Developer Kit for Java for iSeries (AS/400) Javadoc 的位置

java - 如何在特定方案中对 ireport 交叉表中的列进行排序

mysql - 带有 WHERE 子句的 SELECT 作为字符串存储在另一个表中

c# - 双字符串转换

c# - 有什么简单的方法可以将数据导出为多种格式吗?

c# - 将时间跨度格式化为 TotalMilliseconds