Java 打印三角形时出现IllegaArgumentException

Java 打印三角形时出现IllegaArgumentException,java,Java,我想打印出: ____* ___*_* __*___* _*_____* ********* (下划线“u”由空格“”代替) 下面是代码: public static void main(String[] args) { triangle(5); } public static void triangle(int height){ String space = " "; String asterisk = "*"; if(hei

我想打印出:

 ____*
 ___*_*
 __*___*
 _*_____*
 *********
(下划线“u”由空格“”代替)

下面是代码:

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

那么问题出在哪里呢?

问题出在for循环内部的
triangle()
方法中。让我们分析错误代码:
空格。重复(2*i-3)
。for循环第一次运行时,
i
=1


2次i=2。2减3=-1。结果是一个负数。这就是为什么计数为负-1错误

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

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

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

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

1    *
2   *1*
3  *-3-*
4 *--5--*
5*---7---*
你现在看到模式了吗?你计算星号之间的间距的公式显然是错误的
String#repeat(int)
无法填充星号之间的区域,除非您找到
i
与星号之间的空格数之间的正确相关性。您是否看到,在我放置在星号之间的数字的左侧和右侧有等量的破折号,以指示每层的总空间量?这是你应该如何进行的暗示

最后,您上次打印的声明是正确的

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

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

i
为1时,
2*i-3
为负数。似乎您希望顶行有一个特例,因为它只有一个星号。目前,试图在两个星号之间使用-1空格是行不通的。我发布了一个答案,并提示如何推导正确的填充公式。因为这显然是一个家庭作业,如果你不根据我的提示自己去想办法的话,我不会帮你任何忙。如果你想不出答案,我可以稍后再发答案。另一方面,这是问题分解的重要一课。您试图一次解决所有问题,而不是在练习中思考不同的子问题,并尝试独立解决每个问题。@CarterZhang有帮助吗?
    *
   * *
  *   *
 *     *
*********