1

我试图通过随机选择正方形中的一个点并通过它画两条线,然后将这些象限中的每一个分成4个,依此类推,直到宽度/高度为1,将正方形分成4个较小的象限一种递归方式。我的代码在这里:

public static void draw(int x0, int y0, int xmax, int ymax) {

if (Math.abs(xmax - x0) > 1 && Math.abs(ymax - y0) > 1) {
    int rx = r.nextInt(xmax - 1) + 1;    // line A
    int ry = r.nextInt(ymax - 1) + 1;    // line B

    StdDraw.line(rx, y0, rx, ymax);
    StdDraw.line(x0, ry, xmax, ry);

    draw(x0, y0, rx, ry);        // line C
    draw(x0, ry, rx, ymax);      // line D
    draw(rx, ry, xmax, ymax);    // line E
    draw(rx, y0, xmax, ry);      // line F
}
else ;

也就是说,我传递的是左下角坐标(x0,y0)和右上角坐标(xmax,ymax)。每当我注释掉 D、E 和 F 行时,一切正常。但是,当我取消注释 D、E 或 F 中的任何一个时,我会收到此错误java.lang.IllegalArgumentException: n must be positive,通常指向 A 行或 B 行。有人可以告诉我这个错误的含义以及如何解决它吗?

4

2 回答 2

2

这是因为在递归期间的某个地方,传入的值nextInt->(xmax - 1)变为负数。

r.nextInt(xmax - 1);

如果(xmax - 1)为负,您将获得异常。因为,nextInt()方法只接受positive值。

  • 您可以在此行之前添加额外的检查,以检查您的差异是负数还是正数。因此,您可以跳过这部分代码。
于 2012-10-18T15:46:19.680 回答
1

考虑到这nextInt(int n)似乎包含n那段代码中唯一的变量,很可能是引发该错误的变量。

确保xmax-1并且ymax-1不要变成负数,因为文档nextInt特别说明它会在负数上引发此错误:

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextInt(int)

于 2012-10-18T15:46:33.060 回答