[РЕДАКТИРОВАТЬ: я решил проблему. Мне просто нужно сделать массивы статическими. Не могу поверить, что я этого не делал. Спасибо всем за помощь!]

У меня есть программа книжного магазина, где люди могут купить максимум 5 разных книг. Как только они выберут заголовок, он будет добавлен в массив для счета позже. Выбор заголовков и помещение их в массив находится в двух разных классах. На пробу покупаю 2 книги: Атлетика и Автоспорт.

Ожидаемый результат:

You bought 2 book(s)!
1) Athletics Weekly Magazine
2) Autosport Magazine

Отредактированный List.java: я пробовал обе вещи. Сначала меняется на i-1

В SportsMag.java:

import java.util.Scanner;

public class SportMag extends Magazine{

    Scanner scan = new Scanner(System.in);

    public void title() {
        System.out.println("");
        System.out.println("What do you want to buy?");
        System.out.println("1. Athletics Weekly");
        System.out.println("2. Autosport");
        int choice = scan.nextInt();

        List l = new List();

        if (choice==1) {
            l.totalbooks(1);
            l.booknames(1,"Athletics Weekly", "Magazine");  
        } else {
            l.totalbooks(1);
            l.booknames(1,"Autosport", "Magazine"); 
        }

        System.out.println("Do you want to go back to menu? (Yes/No)");
        String back = scan.next();

        if (back.equalsIgnoreCase("Yes")) {
            BookType b = new BookType();
            b.bookMenu();
        }

        if (back.equalsIgnoreCase("No")) {
            l.printInvoice();
        }

    }
}

В List.java (где я печатаю счет):

public class List {

    static int total=0;
    public void totalbooks(int num) {
        total+=num;
    }

    String[] bookname = new String[5];
    String[] booktype = new String[5];
    static int a=0;
    public void booknames(String newBookName, String newBookType) {
        bookname[a]=newBookName;
        booktype[a]=newBookType;
        a++;
    }

    public void printInvoice() {
        System.out.println("You bought "+total+" book(s).");
        for (int i=0; i<total; i+=1) {
            System.out.println((i+1)+") "+bookname[i]+" "+booktype[i]);
        }
    }
}

Результат для этого:

You bought 2 book(s).
1) null null
2) Autosport Magazine

Я также пытался использовать ArrayList:

В СпортМаг.Ява:

//same as above, only a little difference here
        List l = new List();

        if (choice==1) {
            l.totalbooks(1);
            bookname.add("Athletics Weekly");   
        } else {
            l.totalbooks(1);
            bookname.add("Autosport");  
        }

В List.java:

ArrayList<String> bookname = new ArrayList<String>();

public void printInvoice() {
        System.out.println("You bought "+total+" book(s).");
        for (int i=0; i<total; i+=1) {
            System.out.println(bookname.get(i));
        }
    }

Я получил ошибку в SportMag.java, которая говорит bookname cannot be resolved. Предлагаемое быстрое исправление состояло в том, чтобы создать локальную переменную bookname, но тогда она не попадет в массив в List.java.

Я не узнал об ArrayList, поэтому я не совсем уверен, что здесь делать.

Я также попытался сделать другую версию, в которой все находится в основном методе и вызывает только методы в других классах для отображения заголовков, фактически не сканируя ввод в других методах. Я сделал это, чтобы никакие объекты не умирали после каждой функции. Основной стал очень длинным.

Я не знаю, нормально ли это работает для 2 книг, потому что я не могу зацикливаться, так как все в основном.

public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        BookType b = new BookType();
        List l = new List();

        b.bookMenu();
        int booktypechoice = scan.nextInt();

        if (booktypechoice ==1) {
            Magazine mag = new Magazine();
            mag.magtype();
            int magtypechoice = scan.nextInt();

            if (magtypechoice==1) {
                SportMag smag = new SportMag();
                smag.title();
                int smagchoice = scan.nextInt();
                SportMag sportmag = new SportMag();

                if (smagchoice==1) {
                    l.totalbooks(1);
                    l.booknames("Athletics Weekly", "Magazine");
                    System.out.println("Do you want to go back to menu? (Yes/No)");
                    String goback = scan.next();

                    if (goback.equalsIgnoreCase("Yes")) {
                        b.bookMenu();
                    }
                    if (goback.equalsIgnoreCase("No")) {
                        l.printInvoice();
                    }
                } else {
                    l.totalbooks(1);
                    l.booknames("Autosport", "Magazine");
                    System.out.println("Do you want to go back to menu? (Yes/No)");
                    String goback = scan.next();

                    if (goback.equalsIgnoreCase("Yes")) {
                        b.bookMenu();
                    }
                    if (goback.equalsIgnoreCase("No")) {
                        l.printInvoice();
                    }
                }
            } else {
                //all the other book choices goes here.
                //It's really long, but it's just like sportmag up there
            }
         }
      }
   }

Как ввести названия книг в массив и правильно их отобразить?

2
user13302616 13 Апр 2020 в 17:45
Пользовательский ArrayList вместо массива
 – 
Nishanth Matha
13 Апр 2020 в 17:55
OP явно начинающий студент Java. Полегче там, ковбой.
 – 
Pedro Lima
13 Апр 2020 в 17:58
1
Я попытался объявить ArrayList<String> bookname = new ArrayList<String>();, но не могу использовать bookname.add("Autosport"); в другом классе. Это выдаст ошибку, что bookname не может быть разрешен. Когда я попытался использовать метод специально для добавления имени, он по-прежнему дает ту же ошибку.
 – 
user13302616
13 Апр 2020 в 18:20
Пожалуйста, обновите вопрос тем, что вы пробовали
 – 
Nishanth Matha
14 Апр 2020 в 02:50
1
Извините за поздний ответ. Я обновил вопрос.
 – 
user13302616
14 Апр 2020 в 15:48

1 ответ

Я думаю, у вас проблемы с областью действия переменной List l. Вы создаете эту переменную внутри функции title и работаете с ней, подставляя в нее запрошенный клиентом товар. Но тогда куда девается переменная? Он просто умирает в конце функции. Этот объект должен быть в области, которая будет существовать до тех пор, пока он интересен.

Например, вы можете преобразовать эту переменную в свойство вашего основного класса. Это может быть даже статический класс. Вы должны найти лучший способ сохранить ваш объект List. Как бы то ни было, он умирает, как только заканчивается функция title.

1
Pedro Lima 13 Апр 2020 в 20:13
1
Извините, сначала я использовал total и забыл изменить его. Я изменил его на i-1, и теперь вывод 1) Autosport (Magazine) 2) null (null)
 – 
user13302616
13 Апр 2020 в 18:14
Тогда вам следует отредактировать свой вопрос, поскольку эта ошибка не является частью вопроса. Я отредактирую свой ответ.
 – 
Pedro Lima
13 Апр 2020 в 19:57