1

正方形内の点をランダムに選択して2本の線を引き、次にそれらの各象限を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-1ymax-1ならないようにしてください。nextInt

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

于 2012-10-18T15:46:33.060 に答える