0
public class OneHundredDoors 
{
    static OneHundredDoors.Door[] doors = new OneHundredDoors.Door[100];

    static public class Door
    {
        public int doorClosed = 0;

        public void open ()
        {
            this.doorClosed = 0;
        }
        public void close ()
        {
            this.doorClosed = 1;
        }
        private void printStatus (int address)
        {
            if (this.doorClosed == 0)
            {
                System.out.println("Door: " + address + " is Open!");
            }
        }
        public void printStatusOfAll ()
        {
            for (int i = 0; i < doors.length; i++)
            {
                doors[i].printStatus(i);
            }

        }
        public void passDoor (int increment)
        {
            for (int k = 0; k < doors.length; k += increment)
            {
                if (doors[k].doorClosed == 0)
                {
                    doors[k].close();
                }
                else
                {
                    doors[k].close();
                }                       
            }
        }
    }
    public static void main (String [] args)
    {
        for (int i = 0; i < doors.length; i++)
        {
            doors[i] = new OneHundredDoors.Door ();
        }
        for (int j = 0; j < doors.length; j++)
        {
            doors[5].passDoor(j);
        }
        doors[5].printStatusOfAll();    
    }
}

ここでの問題は、doors[5].passDoor(j) のループがまったく機能しないことです。実行時でもコンパイル時でも、エラーは発生しません。何も起こりません。プログラムをしばらく離れて戻ってきても、バックグラウンドで何もしていないことを意味します。このコードは、単にdoors[5].passDoor(2)、次に3、次に4から100までと言うだけで問題を解決します。ループ。

オブジェクトの静的配列について: 申し訳ありませんが、テスト段階で物事を簡単にするためにそうしているので、起動して実行したときに修正します (配列をクラス Door に対してプライベートにすることによって)。

なぜこれが起こっているのか完全に途方に暮れているので、私は本当にこれをここに投稿しています。インターネットで検索するエラーはなく、フリーズもないので、おそらく無限 (または長い) ループではないことがわかります。100 のドアで同様の問題を抱えている人は誰もいないようです (ただし、オブジェクト指向を採用していないためかもしれません)。私が行ったようにそれにアプローチします)。また、私が言ったように 100 回入力すると、コードは完全に正常に動作します (または、少なくとも、実際に 100 回入力する忍耐力があれば、そうなるように思われます)。

最後に、ここでのループは、j < x である x の任意の値に対しては機能しないことに注意してください。(私がここで見逃しているのは、明白で単純なものでなければなりません)。

4

1 に答える 1

4

うまくいかない理由は、次のように ofをpassDoor渡すことです:increment0

for (int k = 0; k < doors.length; k += increment) {

そのため、値がkインクリメントされないため、無限ループが発生します。

于 2012-12-01T17:29:33.287 に答える