我目前正在尝试构建一个程序,通过调用一个方法来构造三角形高度为int参数的方法,以打印不同高度的Pascal三角形。当试图运行我的程序时,第一个Pascal的三角形打印出来然后我得到一个异常错误,读到这个:
java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = 0
at java.util.Formatter$FormatSpecifier.failMismatch(Unknown Source)
at java.util.Formatter$FormatSpecifier.checkBadFlags(Unknown Source)
at java.util.Formatter$FormatSpecifier.checkGeneral(Unknown Source)
at java.util.Formatter$FormatSpecifier.<init>(Unknown Source)
at java.util.Formatter.parse(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.io.PrintStream.format(Unknown Source)
at PascalsTriangle.drawTriangle(PascalsTriangle.java:19)
at PascalsTriangle.main(PascalsTriangle.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
通过调试,我注意到我在第19行中如何格式化String输出存在一个问题。我对Java编程很新,我试图在我的代码中解决不同的格式问题,但我一直难倒如何使这项工作。关于如何防止发生此异常错误的任何建议?
以下是我的程序的代码:
public class PascalsTriangle {
private int height;
public void drawTriangle(int height) {
System.out.println("A Pascal Triangle with height " + height);
for(int i = 0; i <= height; i++) {
int number = 1;
System.out.format("%" + ((height-i) * 2) + "s", " ");
for(int j = 0; j <= i; j++) {
System.out.format("%5d", number);
number = number * (i - j) / (j + 1);
}
System.out.println();
}
}
public static void main(String[] args) {
PascalsTriangle pascal = new PascalsTriangle();
pascal.drawTriangle(4);
pascal.drawTriangle(10);
pascal.drawTriangle(7);
pascal.drawTriangle(2);
}
}
答案 0 :(得分:1)
您可以为格式说明符定义最小填充宽度,以防止出现无效0
大小的宽度:
int padWidth = Math.max(1, ((height - i) * 2));
System.out.format("%" + padWidth + "s", " ");
答案 1 :(得分:1)
由于您在for
循环中正在i <= height
进行迭代,因此i
可能会height
创建"%0s"
,这是不正确的({1}} %
之后的数字必须是正数或负数。尝试在代码中添加+ 1
System.out.format("%" + ((height - i + 1) * 2) + "s", " ");
// ^here
或i
应该是行数,将i <= height
更改为i < height
我不确定这是否就是你在评论中的意思,但也许可以这样做:
public void drawTriangle(int height) {
System.out.println("A Pascal Triangle with height " + height);
for (int i = 0; i <= height; i++) {
int number = 1;
if (i != height)
System.out.format("%" + ((height - i) * 2) + "s", " ");
for (int j = 0; j <= i; j++) {
if (j == 0)
System.out.print(number);
else
System.out.format("%4d", number);
number = number * (i - j) / (j + 1);
}
System.out.println();
}
}
我添加了一些条件,这些条件会阻止在最后一行插入空格以及在连续打印第一个1
时。同时将%5d
更改为%4d
以创建更多“平衡三角形”。如果您希望将其设置为“宽度”,请将%4d
更改为%6d
并使用"%" + ((height - i) * 3) + "s"
(3是%6d
的一半,因此%8d
使用((height - i) * 4))
{{1}}
答案 2 :(得分:0)
即使不是您问题的答案,也要提示:在String.format中使用%%,我的错误是仅对符号使用了%。