递归地划分正方形区域

时间:2012-10-18 15:42:22

标签: java recursion illegalargumentexception

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

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行。有人可以告诉我这个错误意味着什么以及我如何解决它?

2 个答案:

答案 0 :(得分:2)

这是因为在递归过程中的某个地方nextInt - >中传递的值(xmax - 1)正变得消极。

r.nextInt(xmax - 1);

如果(xmax - 1)为否定,您将获得例外。因为nextInt()方法只需要positive个值。

  • 您可以在此行前添加其他检查以检查是否 你的差异是消极的还是积极的。因此,你可以 跳过这部分代码。

答案 1 :(得分:1)

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

请确保xmax-1ymax-1不会变为否定,因为nextInt的文档明确指出它会在负数上抛出此错误:

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