我试图将正方形划分为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行。有人可以告诉我这个错误意味着什么以及我如何解决它?
答案 0 :(得分:2)
这是因为在递归过程中的某个地方nextInt
- >中传递的值(xmax - 1)
正变得消极。
r.nextInt(xmax - 1);
如果(xmax - 1)
为否定,您将获得例外。因为nextInt()
方法只需要positive
个值。
答案 1 :(得分: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)