2

このコマンドをコードのどこに配置すればよいですか?

Item item = new Item();

これをループ内に配置して、ユーザーが別の製品を何回入力したいかによってdo-while新しいクラスを作成し続けるようにする必要があります。Item

問題は、そのコマンドを の中に入れるたびに、プログラムの下部にあるコードに基づいてdo-whileシンボルを見つけることができないことです。itemじゃあどこに置けばいいの?

私のコード:

public static void main(String[] args) {

    Scanner scan = new Scanner(System. in );
    String prompt, id;
    int z = 0, choice, x = 999;
    int iprice;
    String icode;
    String iname;

    class Item {
        public int price;
        public String code;
        public String name;
    }

    ArrayList<Item> cart = new ArrayList<Item>(0);

    do {
        System.out.print("\nItem Code: ");
        icode = scan.next();
        System.out.print("Item Name: ");
        iname = scan.next();
        System.out.print("Item Price: ");
        iprice = scan.nextInt();

        item.code = icode;
        item.name = iname;
        item.price = iprice;

        cart.add(item);

        System.out.print("\tInput another? Y/N? ");
        prompt = scan.next();

    } while (prompt.equals("y"));

    System.out.println("\nWhat do you want to do?");
    System.out.println("\n1. Purchase Item ");
    System.out.println("2. List of Products ");
    System.out.println("3. Exit Program ");

    System.out.print("\n\tChoice: ");
    choice = scan.nextInt();
    if (choice == 1) {
        System.out.println("\nItem Code: ");
        id = scan.next();
        if (item.code.equals(id)) {
            System.out.println("Item Name: " + item.name);
            System.out.println("Item Price: " + item.price);
        }
    }
}
4

3 に答える 3

2

おそらく、ループの外側で変数を宣言する必要があります。

Item item;

そして、ループの最初で初期化する必要があります。

item = new Item();

このようにして、変数はクラス全体で表示されるため、言及したエラーは発生しません...

また、これは基本的に、各ループ反復で新しいオブジェクトを作成していることを意味し、この新しいオブジェクトをitem以前に宣言した変数に割り当てているため、ユーザーは必要な数の異なるアイテムを作成できます...

各反復で変数をオーバーライドしていますが、変数に以前にアタッチされたオブジェクトを失うことはないことに注意してください.itemitemArrayList<Item> cartcart.add(item)

Java でのクラスとオブジェクトの宣言、スコープなどに関するこの記事を読みたいと思うかもしれません...

于 2013-10-20T15:40:40.690 に答える
1

場合によります。ループの外側またはクラス定義に配置して、変数を何度も再利用し、パスごとにローカル変数を作成する必要がないようにすることができます。
次のようなもの:

Item myItem;

do{
    myItem = new Item();
    // add perfumes and shoes
    // maybe GTA 5
}while(condition)  

あなたは勉強する必要があります、いわゆる、variable scope. つまり、変数にアクセスできる場所とアクセスできない場所です。ここ: http://docs.oracle.com/javase/tutorial/java/javaOO/variables.html

于 2013-10-20T15:40:21.157 に答える
1

do-while ループ内に新しいオブジェクトを作成しItem item = new Item();ます。以下に変更を加えました...

public static void main(String[] args) {
            // TODO, add your application code
            Scanner scan = new Scanner (System.in);
            String prompt, id; 
            int z=0, choice, x=999;
            int iprice;
            String icode;
            String iname;


            class Item {
                public int price;
                public String code;
                public String name;

            }   

            ArrayList<Item> cart = new ArrayList<Item>(0);
             Item item; // type this
                do {

            System.out.print("\nItem Code: ");
            icode=scan.next();
            System.out.print("Item Name: ");
            iname=scan.next();
            System.out.print("Item Price: ");
            iprice=scan.nextInt();


            item = new Item();  //also create new Item(); here
            item.code=icode;
            item.name=iname;
            item.price=iprice;

            cart.add(item);

            System.out.print("\tInput another? Y/N? ");
            prompt=scan.next();
            }while (prompt.equals("y"));

            System.out.println("\nWhat do you want to do?");
            System.out.println("\n1. Purchase Item ");
            System.out.println("2. List of Products ");
            System.out.println("3. Exit Program ");
            System.out.print("\n\tChoice: ");
            choice=scan.nextInt();
             if (choice==1) {

            System.out.println("\nItem Code: ");
            id=scan.next();
                    if (item.code.equals(id)) {         
            System.out.println("Item Name: "+item.name);
            System.out.println("Item Price: "+item.price);

                    }       
             }






        }
        }
于 2013-10-20T15:50:17.287 に答える