Ошибка ввода в консольной системе учета инвентаря продуктов

Проект - система учета инвентаря продуктов. Код должен создавать объекты класса Produkt с введёнными пользователем параметрами и заносит их в ArrayList, после чего с ними можно будет работать(редактировать, удалять) Но проблема возникла во время реализации первой же функции

*Exception in thread "main"
 java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    at com.company.Main.main(Main.java:46)*

Это выводиться в консоль после ввода названия второго объекта.

Вот мой код:

package com.company;
import java.util.ArrayList;
import java.util.Scanner;
//класс для управления складом
class Inventory{

    //список для хранения продуктов
    private final ArrayList<Produkt> produkts = new ArrayList<>();

    //метод для добавления продуктов в список
    void addToList(Produkt produkt){
        produkts.add(produkt);
    }

    //метод для вывода содержимого списка
    void printAll(){
        for (int i = 0; i < produkts.size(); i++){
            System.out.printf("%d) %s / количестово:%d / цена за единицу:%f / цена всего:%f / \n", i + 1, produkts.get(i).name, produkts.get(i).sum, produkts.get(i).cost, produkts.get(i).sum * produkts.get(i).cost);
        }
    }
}
//класс для создания продуктов
class Produkt{
    String name;
    double cost;
    int sum;
    //конструктор класса
    public Produkt(String name, int colVo, double cost){
        this.name = name;
        this.sum = colVo;
        this.cost = cost;
    }


}


public class Main {

    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        Inventory inv = new Inventory();
        //цыкл для работы пока-что единственной функции
        while(true) {
            inv.addToList(new Produkt(sc.nextLine(), sc.nextInt(), sc.nextDouble()));
            inv.printAll();

        }
    }
}

Долго сидел над кодом, читал форумы, так ничего и не получилось. Иногда код людей с такой ошибкой нормально запускался на других компьютерах, но я всё-таки думаю, что проблема в коде. Заранее спасибо)


Ответы (1 шт):

Автор решения: Дмитрий
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.function.Function;

public class Main {

    private final static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        Inventory inv = new Inventory();
        //цыкл для работы пока-что единственной функции
        while (true) {
            try {
                inv.addToList(new Product(input(Function.identity()), input(Integer::valueOf), input(Long::valueOf)));
                inv.printAll();
            } catch (Exception e) {
                System.out.println("Некорректный ввод! Попробуйте еще раз.");
            }
        }
    }

    private static <T> T input(Function<String, T> function) {
        return function.apply(sc.nextLine());
    }
}

class Inventory {

    //список для хранения продуктов
    private final List<Product> produkts = new ArrayList<>();

    //метод для добавления продуктов в список
    void addToList(Product product) {
        produkts.add(product);
    }

    //метод для вывода содержимого списка
    void printAll() {
        produkts.forEach(System.out::println);
    }
}

class Product {

    private final String name;
    private final Integer numb;
    private final Long cost;

    public Product(String name, Integer numb, Long cost) {
        this.name = name;
        this.numb = numb;
        this.cost = cost;
    }

    @Override
    public String toString() {
        return name + "; количестово: " + numb + "; цена за единицу: " + cost + "; цена всего: " + numb * cost;
    }

}

Деньги храним в минимальной единице (копейки, центы итд). Метод, отвечающий за пользовательский ввод, лучше писать отдельно, так проще будет обрабатывать эти данные , если это потребуется (с высокой вероятностью это так и будет), кроме того, SOLID никто не отменял. И по этой же причине за вывод в консоль должен быть ответственен класс модели (продукты в данном случае), а не класс, ответственный за ввод.

→ Ссылка