1

現在、シェイプクラスを含むクラシックシェイププログラムを実行しています。円や長方形のオブジェクトを問題なく作成できます。しかし、すべてのオブジェクトの周囲または面積を取得すると、すべてのオブジェクトがnullであることがわかります。コードは次のとおりです。

//ケースメニュー選択アクション

ここでは、インスタンス変数と配列です

private int menu_select;
private int i=0;
private Shape[] s = new Shape[10];

メニューオプションは次のとおりです

public static void display_menu()
{
    System.out.print("Choose an option:\n"+
            "1-Add a new circle\n"+
            "2-Add a new rectangle\n"+
            "3-Delete all shapes\n"+
            "4-Scale all shapes\n"+
            "5-Display perimeter of all shapes\n"+
            "6-Display the area of all shapes\n"+
            "7-Enter scale factor\n"+
            "8-Exit program\n");
}

これがメニューコードです

これがスイッチです

//Case menu selection actions
    public void select_case()
    {

        if(i<=10)
        {
            switch (menu_select)
            {


                 case 1: Circle c = new Circle(1);
                         s[i]=c;
                         i++;
                         break;
                 case 2: Rectangle r = new Rectangle(1,1);
                         s[i]=r;
                         i++;
                         break;

                 case 3: s=null;
                         i=0;
                         break;
                 case 4: Scanner input = new Scanner(System.in);  
                         double d = input.nextDouble();
                         for(int i=0; i<s.length; i++)
                         {
                             s[i].setScaleFactor(d);
                         }
                         break;
                 case 5: for(int i=0; i<s.length; i++)
                         {
                            if(s[i] != null)
                            {   
                                System.out.println(s[i].getPerimeter());
                            }
                         }
                         break;
                 case 6: for(int i=0; i<s.length; i++)
                         {
                            System.out.println(s[i].getArea());
                         }
                         break;
                 case 7: //Enter scale factor

                        //No need for a case 8 since while loop terminates it.
                 default: System.out.println("Number must be 1-8");

            }
        }
    }

これが主な方法です

public static void main(String args[])
    {
        Menu m;
        do
        {
            Menu.display_menu();
            m = new Menu(0);

        }
        while(m.getMenu_Select() != 8);



    }

}

形状配列インデックスに固定数を指定しようとしましたが、それでもnullオブジェクトを取得します。また、固定インデックスを使用してforループを削除しようとしましたが、それでもnullオブジェクトを取得します。

4

2 に答える 2

0

ループを繰り返すたびに、新しいMenuオブジェクトを作成しています。

    {
        Menu.display_menu();
        m = new Menu(0); // here!

    }

このオブジェクトに加えられた変更は、次のオブジェクトに影響やメモリを与えないため、これを行わないでください。

ループの前に1つのMenuオブジェクトを作成し、ループ内でそのオブジェクトのメソッドを呼び出します

于 2012-10-11T00:22:37.440 に答える
0

次のコードで「i」は10に等しくなりますか?

配列の最大インデックスは9である必要があります

public void select_case()
{
    if(i<=10)
    {
        switch (menu_select)
        {
于 2012-10-11T00:31:32.703 に答える