Как найти исправление для моей ошибки приведения во время выполнения? - PullRequest
0 голосов
/ 30 апреля 2020

Итак, у меня есть класс Prodcut, который принимает String, String, int, Double (ID, имя, количество, стоимость).

У меня также есть класс Store, где я храню все свои методы и вызвать их из меню консоли. Например, вот мой метод addProduct, который позже выдает мне ошибку:

Product newProdcut(String id, String prodName, Integer prodQuantity, Double prodCost) throws Exception {
        Scanner sc = new Scanner(System.in);
        for ( Product p : products ) {
            if ( id.equals(p.id)) {
                System.out.println("Product already exists, please enter the number of the quantity you want to add to the existing quantity:");
                int inputQuantity = sc.nextInt();
                prodQuantity += inputQuantity;
            }
        }
        Product p = new Product(id, prodName, prodQuantity, prodCost);
        this.products.add(p);
        System.out.println("Prodcut "+p.createOutput()+" was added to the list");
        return p;
    }

В моем меню у меня есть метод, который заполняет переменные, поэтому я смогу использовать их в menu:

private static ArrayList<String> menuAddProdcut() throws Exception { // 1. Add a prodcut
        Random rand = new Random();
        System.out.println("You're adding a new prodcut");
        ArrayList newProductArray = new ArrayList<>();      
        int prodId = rand.nextInt(1000) + 100;
        String prodIdStr = Integer.toString(prodId); 
        System.out.println("Enter product name:");
        String prodName = sc.nextLine();
        System.out.println("Enter quantity:");
        Integer prodQuantity = sc.nextInt();
        System.out.println("Enter product's price:");
        Double price = sc.nextDouble();
        newProductArray.add(prodIdStr); //str-converted ID
        newProductArray.add(prodName);
        newProductArray.add(prodQuantity);
        newProductArray.add(price);

        return newProductArray;         
    }

Вот как я вызываю функцию из меню:

case 1:
        try {
           ArrayList<String> productToPopulate = Menu.menuAddProdcut();
           int quantity = Integer.parseInt(productToPopulate.get(2));
           Double cost = Double.parseDouble(productToPopulate.get(3));
           st.newProdcut(productToPopulate.get(0), productToPopulate.get(1), quantity, cost);
       } catch (Exception e) {
           e.printStackTrace();
        }
    break;

Когда я запускаю программу и пытаюсь добавить продукт, я получаю эту ошибку: java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')

Итак, я гуглил его и обнаружил, что должен привести его к строке, но я не могу, потому что метод принимает str str int double, а не 4 str.

Какова моя альтернатива здесь?

Полная ошибка:

java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
        at Menu.employeeSubMenu(Menu.java:119)
        at Menu.mainMenu(Menu.java:60)
        at Menu.main(Menu.java:25)

1 Ответ

3 голосов
/ 30 апреля 2020

Проблема вызвана этой строкой:

ArrayList newProductArray = new ArrayList<>(); 

Вы определяете переменную как необработанный тип ArrayList (необработанные типы - это когда вы не указываете аргумент типа для типа, который нуждается в нем ). Необработанные типы следует избегать любой ценой.

В этом случае это приводит к методу menuAddProdcut, возвращающему ArrayList<String>, который содержит объекты, которые не являются String s! Это не должно быть возможным в полной системе типов и может происходить только потому, что необработанные типы нарушают систему типов (помните, когда я говорил вам избегать их?)

Измените код на

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

Затем компилятор скажет вам, что эти строки не работают:

newProductArray.add(prodQuantity);
newProductArray.add(price);

Поскольку вы пытаетесь добавить Integer и Double соответственно к ArrayList<String>. Измените их на что-то вроде

newProductArray.add(prodQuantity.toString());
newProductArray.add(price.toString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...