Ошибка ввода в консольной системе учета инвентаря продуктов
Проект - система учета инвентаря продуктов. Код должен создавать объекты класса 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 никто не отменял. И по этой же причине за вывод в консоль должен быть ответственен класс модели (продукты в данном случае), а не класс, ответственный за ввод.