2

我目前正在尝试构建一个程序,该程序通过调用一个方法来打印不同高度的帕斯卡三角形,该方法使用一个用于三角形高度的 int 参数来构造三角形。当试图运行我的程序时,第一个 Pascal 的三角形打印 bu 然后我得到一个异常错误,读到:

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 行中的字符串输出存在问题。我对 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);
  }
}
4

3 回答 3

2

您可以为格式说明符定义最小填充宽度,以防止出现无效0大小的宽度:

int padWidth = Math.max(1, ((height - i) * 2));
System.out.format("%" + padWidth + "s", " ");
于 2013-05-19T23:18:29.403 回答
2

由于在您的for循环中您正在迭代 whilei <= height那么可能iheight创建"%0s"不正确的相等(后面的数字%必须是正数或负数)。尝试添加+ 1您的代码

System.out.format("%" + ((height - i + 1) * 2) + "s", " ");
//                                   ^here

或者是否i应该将行数更改i <= heighti < 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 is half of %6d, so for %8duse((height - i) * 4))

于 2013-05-19T23:19:59.373 回答
0

即使这不是您的问题的答案,提示:在 String.format 中使用 %%,我的错误是仅使用 1% 作为符号。

于 2019-11-14T22:17:59.633 回答