【问题标题】:Why are printf not working properly in Java? JAVA为什么 printf 在 Java 中不能正常工作? JAVA
【发布时间】:2019-02-05 05:59:12
【问题描述】:

我的 Eclipse 软件出现这种类型的错误:

问题

为什么会出错?

代码:

    package loops;
    public class Escapey {
        public static void main(String[] args) {
            String name ="micheal";
            System.out.printf("i am %s, my friend name also %s",name);
        }
    }

错误信息:

线程“主”java.util.MissingFormatArgumentException 中的异常:java.base/java.util.Formatter.format(Formatter.java:2672) 处 java.base/java.io.PrintStream 处的格式说明符“%s” .format(PrintStream.java:1053) 在 java.base/java.io.PrintStream.printf(PrintStream.java:949) 在 loops.Escapey.main(Escapey.java:5)

  • 输出除外:(

【问题讨论】:

  • 只要输入, name, name);...
  • 因为每个 %s 都是一个参数,而你只有一个参数

标签: java printf uiprintformatter


【解决方案1】:

您可以指定参数两次,或者在格式字符串中引用时指定索引:

System.out.printf("i am %1$s, my friend's name also %1$s", name);

【讨论】:

  • @l'L'l 是%0 实际上保证的行为?我在文档中看不到:所有示例都从 1 开始。
  • @l'L'l 我不是要你证明它有效:我知道它确实有效。这不是重点:我在质疑您是否应该依赖无证行为。
  • @AndyTurner:,不应该依赖未记录的行为。奇怪的是javac 甚至没有警告它。 C 编译器可以。我很确定Java 只是将%0$s 视为%s,(%000000$s 也不例外)。
  • “或者你可以做”不要推荐你不应该在没有大警告的情况下依赖的东西!
  • @AndyTurner:我通过这里的讨论了解到了这些信息。我不是编译器——这应该是警告的来源!我无法编辑我之前写的内容;我已经删除了它,虽然后面的 cmets 没有多大意义,所以你也可以考虑删除你的 cmets。
【解决方案2】:

通过有两个%s printf 期待two 参数

喜欢

System.out.printf("i am %s, my friend's name also %s",name, name);

【讨论】:

    【解决方案3】:

    一个解决方案,

    System.out.print("i am " + name + ", my friend name also " + name); // If you want to continue on same line 
    System.out.println("i am " + name + ", my friend name also " + name); // If you want to continue on next line 
    

    由于您有两个 %s,因此需要两个参数,因此您可以指定两个参数。

    System.out.printf("i am %s, my friend name also %s",name, name);
    

    或者在字符串中指定一个索引。 %1$s 将获得第一个参数,在本例中为 name

    System.out.printf("i am %1$s, my friend's name also %1$s", name);
    

    在这里阅读更多! :)

    Java printf( ) Method Quick Reference

    Java Format - Java printf Value Index// explicit indexing, relative indexing

    【讨论】:

    • System.out.print("我是%s,我的朋友名字也是%s",name); |错误:|没有找到适合打印的方法(java.lang.String,java.lang.String)
    • @Micheal 显式索引!我已经用很好的链接更新了我的答案,我认为你会觉得很有帮助(尤其是第二个)。
    • 哇,你太棒了,它现在可以工作了 :) 谢谢你的链接 :) :)
    • 没问题!考虑验证此答案,以便其他有相同问题的人轻松找到解决方案:)
    【解决方案4】:

    使用这个...

    System.out.printf("i am %s, my friend name also %s",name, name);
    

    你给出了两个说明符。所以你需要在这里给名字两次。

    【讨论】:

      【解决方案5】:

      一种非常晦涩的方法:

      System.out.printf("i am %s, my friend's name also %<s", name);
      

      我实际上从未使用过它,但在Formatter 的文档中提到了它。

      按位置引用参数的另一种方法是使用'&lt;' ('\u003c') 标志,这会导致先前格式说明符的参数被重复使用。

      【讨论】:

      • 字符串名称=“确定”; System.out.printf("%s 是我的名字,%
      • @Micheal 制作好代码的一部分是让代码易于理解,而 IMVHO 这种晦涩难懂的方式不利于使其易于理解。
      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 2020-09-19
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2014-02-21
      • 2021-06-28
      • 2016-07-16
      相关资源
      最近更新 更多