Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么printf在Java中不能正常工作?JAVA_Java_Printf_Uiprintformatter - Fatal编程技术网

为什么printf在Java中不能正常工作?JAVA

为什么printf在Java中不能正常工作?JAVA,java,printf,uiprintformatter,Java,Printf,Uiprintformatter,我在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); }

我在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.formatFormatter.java:2672 at java.base/java.io.PrintStream.formatPrintStream.java:1053 at java.base/java.io.PrintStream.PrintFPPrintStream.java:949 at loops.Escapey.mainEscapey.java:5

输出除外: 由于有两个%s,printf需要两个参数

用这个

System.out.printf("i am %s, my friend name also %s",name, name);
您正在提供两个说明符。因此,您需要在此处给出两次名称。

一个解决方案

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);

这是一种相当晦涩的方法:

System.out.printf("i am %s, my friend's name also %<s", name);
我从来没有使用过这个,但在的文档中提到过


按位置引用参数的另一种方法是使用'justput,name,name;。。。因为每个%s都是一个参数,而您只有一个参数System.out.printi我是%s,我的朋友的名字也是%s,name;|错误:|未找到适合printjava.lang.String、java.lang的方法。String@Micheal显式索引!我用好的链接更新了我的答案,你会发现非常有用,我认为第二个特别有用。哇,你太棒了,它现在可以工作了:谢谢你的链接::没问题!考虑验证这个答案,其他有相同问题的人很容易找到一个解决办法:@ L’L是% 0实际上保证的行为吗?我在文档中看不到它:所有的例子都是从1开始的。@l'l'l我不是要你证明它是有效的:我看到它是有效的。这不是问题的关键:我在问你是否应该依赖未记录的行为。@AndyTurner:不,不应该依赖未记录的行为。奇怪的是,javac甚至没有对此发出警告;C编译器可以。我很确定Java只是将%0$s视为%s,%000000$s没有什么不同。或者,如果没有重大警告,您可以不推荐不应该依赖的东西@安德特特纳:我是通过我们在这里的讨论了解到这个信息的。我不是一个编译器——这就是警告的来源!我无法编辑我之前写的内容;我已经删除了它,虽然下面的评论没有什么意义,所以你也可以考虑删除你的评论。System.out.printf%s是我的名字,%@Micheal编写好代码的一部分是使代码易于理解,而IMVHO这种晦涩的方式不利于使代码易于理解。
System.out.printf("i am %1$s, my friend's name also %1$s", name);
System.out.printf("i am %s, my friend's name also %<s", name);