Не отрабатывает Scanner во второй раз [дубликат]

127
03 февраля 2021, 08:50
На этот вопрос уже дан ответ здесь:
Особенности использования scanner.nextLine() (1 ответ)
Закрыт 1 год назад.

Есть метод добавления товара в корзину, когда вызываю его в первый раз, всё отрабатывает корректно, когда вызываю второй раз в product ничего не записывается, при вызове в третий раз, всё снова отрабатывается корректно.

public void addProduct() {
    String product;
    int quantity;
    System.out.print("Пожалуйста, введите наименование товара: ");
    product = scan.nextLine();
    for (Product p : Products) {
        if (product.equalsIgnoreCase(p.getName())) {
            System.out.print("Пожалуйста, введите количество нужного товара: ");
            quantity = scan.nextInt();
            System.out.println("Товар: " + product + ", в количестве: " + quantity + " шт. был успешно добавлен в корзину!");
            choose = product + " " + quantity;
            Goods.add(choose);
            sum += p.getCost() * quantity;
        }
    }
}

Может кто поможет понять, почему не хочет сканировать во второй раз?

Answer 1

nextInt() забирает из введённой строки только число, но оставляет \n - символ переноса строки, который получается, когда пользователь нажимает Enter. Затем при вызове метода nextLine() он читает этот оставшийся символ и сразу заканчивает работу. Проблему легко можно решить добавив вызов nextLine(), после вызова nextInt(). Он будет читать этот символ. Зато следующий nextLine() отработает как надо.

public void addProduct() {
    String product;
    int quantity;
    System.out.print("Пожалуйста, введите наименование товара: ");
    product = scan.nextLine();
    for (Product p : Products) {
        if (product.equalsIgnoreCase(p.getName())) {
            System.out.print("Пожалуйста, введите количество нужного товара: ");
            quantity = scan.nextInt();
            scan.nextLine();     //fix!
            System.out.println("Товар: " + product + ", в количестве: " + quantity + " шт. был успешно добавлен в корзину!");
            choose = product + " " + quantity;
            Goods.add(choose);
            sum += p.getCost() * quantity;
        }
    }
}

Вот рабочий код. И ссылка на такой же вопрос на англоязычном stackoverflow.

Answer 2
Сделайте примерно так...

Классы Product и Basket написал, а класс Main попробуйте отрефакторить сами

import java.io.IOException;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
    public static void main(String[] args) throws IOException {

        List<Product> productList = new ArrayList<>();
        productList.add(new Product ("aaa", 3));
        productList.add(new Product ("bbb", 2));
        productList.add(new Product ("ccc", 4));
        Basket basket = new Basket();
        addProduct(basket, productList);
        addProduct(basket, productList);
        addProduct(basket, productList);
        System.out.println(basket.get());
        System.out.println(basket.getTotalCost());
    }
    public static boolean addProduct(Basket basket, List<Product> products) {
        try {
            Scanner scan = new Scanner(System.in);
            System.out.println("Пожалуйста, введите наименование товара: ");
            String choose = scan.nextLine();
            for (Product product : products) {
                if (product.getName().equals(choose)) {
                    System.out.println("Пожалуйста, введите количество нужного товара: ");
                    int quantity = basket.add(product, scan.nextInt());
                    System.out.println("Товар: " + product + ", в количестве: " + quantity + " шт. был успешно добавлен в корзину!");
                    return true;
                }
            }
            System.out.println("Товар не найден!");            
        } catch (InputMismatchException e) {
            System.out.println("Ошибка при вводе количества товара!");
        }
        return false;
    }
}

class Product implements Comparable<Product>{
    private final String name;
    private final int cost;
    public Product(String name, int cost) {
        this.name = name;
        this.cost = cost;
    }
    public String getName() {
        return name;
    }
    public int getCost() {
        return cost;
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 73 * hash + Objects.hashCode(this.name);
        hash = 73 * hash + this.cost;
        return hash;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Product other = (Product) obj;
        if (this.cost != other.cost) {
            return false;
        }
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        return true;
    }
    @Override
    public String toString() {
        return "Product{" + "name=" + name + ", cost=" + cost + '}';
    }
    @Override
    public int compareTo(Product p) {
        return (p==null) ? -1 : this.getName().compareTo(p.getName());
    }
}
class Basket {
    private final Map<Product, Integer> basketMap = new TreeMap<>();
    public int add(Product choose, int quantity){
        if (!basketMap.containsKey(choose)) basketMap.put(choose, quantity);
        else basketMap.put(choose, basketMap.get(choose) + quantity);
        return quantity;
    }
    public Map<Product, Integer> get(){
        return basketMap;
    }
    public int getTotalCost(){
        return basketMap.entrySet().stream()
                .mapToInt(e -> e.getKey().getCost()*e.getValue())
                .sum();
    }
}
READ ALSO
Какой командой можно проверить, есть ли в компьютере файлы?

Какой командой можно проверить, есть ли в компьютере файлы?

нужна команда(ы), которые смогут проверить, есть ли ф указаном пути, файлы, разных расшрений, или просто, чтобы по имени файлов нашло их

114
Взаимная блокировка

Взаимная блокировка

Главный поток входит в монитор объекта AСоперничающий входит в монитор объекта B

101
HQL getSingleResult с подзапросом

HQL getSingleResult с подзапросом

Пытаюсь написать запрос на hql, который вернет одну цифру методом getSingleResult(), все вполне сносно работало до тех пор, пока не появилась нужда...

120
Тестирование на java selenium

Тестирование на java selenium

Задача: залогиниться на сайт https://accountsgoogle

140