打印出三角形时的 IllegalArgumentException

时间:2021-03-04 00:44:02

标签: java

我想打印出来:

 ____*
 ___*_*
 __*___*
 _*_____*
 *********

(下划线“_”被空格“”代替)

代码如下:

 public static void main(String[] args) {
    triangle(5);
 }

public static void triangle(int height){
String space = " ";
String asterisk = "*";

if(height == 1){
    System.out.println(asterisk);
}else{
    //print out the "height - 1" line of triangle
    for (int i = 1; i <= height - 1; i++) {
        System.out.println(space.repeat(height - i) + asterisk + space.repeat(2 * i - 3) + asterisk);
    }
    System.out.println(asterisk.repeat(2 * height - 1));
}

}

然后点击“运行”,控制台上说:

Exception in thread "main" java.lang.IllegalArgumentException: count is negative: -1
  at java.base/java.lang.String.repeat(String.java:3565)
  at comp1110.lab2.Triangle.triangle(Triangle.java:16)
  at comp1110.lab2.Triangle.main(Triangle.java:47)

有什么问题吗?

2 个答案:

答案 0 :(得分:2)

您有两个问题.... 一,@ublec 已经提到过。你的第一个循环失败,因为你的数学是错误的。另一个是你试图一次解决所有问题,而不是把这个问题分解成更小的问题(问题分解)。当你这样做时,你会找到每个部分的解决方案,然后通过对所有部分求和来合成整体解决方案。

让我们分解问题。你首先有三角形前半部分的间距问题:

1   *
2  *
3 *
4*

星号前的空格是 1 减去高度。因此,对于 5 的高度,您的顶层有 4 个空格,然后是星号,然后是 3 加上星号,依此类推。您应该在 System.out.print() 语句(而不是 println)中处理该部分。现在你有了它,你需要“绘制”三角形的后半部分。

顶层可以简单地打印换行符。但是,对于后续级别,间距为 1、3、5、7 等...

1    *
2   *1*
3  *-3-*
4 *--5--*
5*---7---*

你现在看到图案了吗?您计算星号之间填充的公式显然是错误的。除非您找到 String#repeat(int) 与星号之间的空格数之间的正确关联,否则 i 将无法填充星号之间的区域。您是否看到这样一个事实,即我放置在星号之间的数字的左侧和右侧有相等数量的破折号,以表示每层的空间总量?这是您应该如何进行的提示。

最后,您最后的打印输出语句是正确的。

我按照我建议的修改运行了您的代码,这是我对高度为 5 的三角形的输出:

    *
   * *
  *   *
 *     *
*********

答案 1 :(得分:1)

问题出在 for 循环内的 triangle() 方法中。我们来分析一下错误代码:space.repeat(2 * i - 3)。在 for 循环第一次运行时,i = 1。

2 次 i = 2。2 减 3 = -1。结果是负数。这就是为什么您的计数为 negative -1 error