Для L oop не работает в Java - PullRequest
       7

Для L oop не работает в Java

0 голосов
/ 07 февраля 2020

Итак, я недавно начал писать код на Java и переписал одну из моих первых программ, пытаясь сделать ее более элегантной с помощью методов. Вот что я придумал:

import java.util.Scanner;
import java.util.ArrayList;

public class groceries {

    static Scanner scan = new Scanner(System.in);
    static ArrayList<String> shoppinglist = new ArrayList<>();
    static int b = 0;
    static String n ="";

    public static void main(String[] args) {
        getAmount(b);
        getInput(b, n);
        output();
    }

    private static void message (String m) {
        System.out.println(m);
    }

    private static void getAmount(int b) {
        message("How many articles do you want to buy?");
        b = scan.nextInt();
    }

    private static void getInput(int b, String n) {
        message("Which articles specifically do you want to buy?");
            for (int i = 0; i <= b; i++) {
                n = scan.nextLine();
                shoppinglist.add(n);
            }
        }

    private static void output() {
        message("Here are your purchases:");
        for (int k = 0; k<shoppinglist.size(); k++){
            message(shoppinglist.get(k));
        }
    }
}

Все отлично работает, пока я не нажму getInput - я не могу ввести никакой ввод. Программа просто завершает работу и выходит.

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Вы вызываете метод nextInt() раньше.

Проблема в том, что nextInt () не использует '\n', поэтому следующий вызов nextLine() использует его, а затем ожидает чтения вход для «Какие статьи конкретно вы хотите купить?».

Вам нужно потреблять '\n' перед вызовом nextLine().

 private static void getAmount(int b) {
    message("How many articles do you want to buy?");
    b = scan.nextInt();
    scan.nextLine();// adding this, it will force to consume the '\n'
}

С этим связано: Сканер пропускает nextLine () после использования next () или nextFoo ()?

0 голосов
/ 07 февраля 2020

Одна ошибка - создать слишком много полей. Я не изменял дизайн вашего класса, но я удалил все поля, которые действительно не нужны. Я оставил два: один для ввода и один для вывода, поскольку они не являются основными входными или выходными параметрами функций. Обычно это переменные экземпляра, а не переменные класса (т. Е. Без static).

Еще одна ошибка - это так называемая односторонняя. Он присутствует, если у вас есть индекс на основе нуля индекс i, а затем у вас есть ряд элементов i <= b. Это неверно, должно быть i < b. Однако, поскольку вы забыли удалить начальную строку чтения после того, как был установлен счетчик b, вы попытались исправить это таким образом, возможно, оставив вам элемент, который представляет собой просто пустую строку "".

Здесь это некоторый код, в котором я также попытался переименовать ваши переменные и имена.

public class Groceries {
    private static Scanner scan = new Scanner(System.in);
    private static PrintStream out = System.out;

    public static void main(String[] args) {
        int b = retrieveAmountOfGroceries();
        var shoppinglist = retrieveGroceries(b);
        printPurchases(shoppinglist);
    }

    private static void message(String m) {
        out.println(m);
    }

    private static int retrieveAmountOfGroceries() {
        message("How many articles do you want to buy?");
        int amount = scan.nextInt();
        // remove the next newline
        scan.nextLine();
        return amount;
    }

    private static ArrayList<String> retrieveGroceries(int amountOfGroceries) {
        var shoppinglist = new ArrayList<String>();
        message("Which articles specifically do you want to buy?");
        // note that we're having i < b not i <= b
        for (int i = 0; i < amountOfGroceries; i++) {
            String n = scan.nextLine();
            shoppinglist.add(n);
        }
        return shoppinglist;
    }

    private static void printPurchases(ArrayList<String> shoppinglist) {
        message("Here are your purchases:");
        for (int i = 0; i < shoppinglist.size(); i++) {
            message(shoppinglist.get(i));
        }
    }
}
0 голосов
/ 07 февраля 2020

В коде есть несколько ошибок, поэтому я переписал его.

  1. Как кто-то еще указал, есть проблема с Scanner. Проверьте код.
  2. Вы скрываете переменную stati c b, потому что вы использовали ее в качестве параметра метода, и это является ошибкой и избыточностью.
  3. Кроме того, у вас есть ошибка в том, как вы использовали индекс в for l oop из getInput.

Другие мелкие исправления и вот оно:

import java.util.Scanner;
import java.util.ArrayList;

public class Groceries {

  static Scanner scan = new Scanner(System.in);
  static ArrayList<String> shoppingList = new ArrayList<>();
  static int b = 0;

  public static void main(String[] args) {
    getAmount();
    getInput();
    output();
  }

  private static void getAmount() {
    System.out.println("How many articles do you want to buy?");
    b = scan.nextInt();
    System.out.println(b);
    scan.nextLine(); // this is required
  }

  private static void getInput() {
    System.out.println("Which articles specifically do you want to buy?");
    for (int i = 0; i < b; i++) { // bug fixed
      String n = scan.nextLine();
      shoppingList.add(n);
    }
  }

  private static void output (){
    System.out.println("Here are your purchases:");
    for (int i = 0; i< shoppingList.size(); i++){
      System.out.println (shoppingList.get(i) );
    }
  }

}

Незначительное исправление стиля: метод message является избыточным. Удалены. Java кодеры более знакомы, если они видят System.out.println() вместо message(), и первый символ класса предлагается в верхнем регистре (Продовольственные товары вместо продовольственных продуктов). Экземпляры объекта, с другой стороны, начинаются с символа нижнего регистра. Вам нужно будет переименовать файл. java файл в бакалейные лавки. java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...