Ввод/вывод данных с клавиатуры с помощью case

194
05 февраля 2019, 23:20

Дорогие программисты. По задумке моей программы пользователь вводит несколько строк, а потом программа их выводит на экран. Загвоздка в том, что я делаю это через 2 кейса. И поскольку значение переменных в каждом кейсе не сохраняется, то я сами переменные закинул в паблик класс, однако при запуске выдает ошибку.

Основной класс:

 case 1: //кейс с вводом содержимого n строк
                System.out.print("Введите количество строк: ");
                if (scanner.hasNextInt()) {
                    data.n = scanner.nextInt();
                } else {
                    System.out.print("Введены некорректные данные!");
                    return;
                }

                scanner.nextLine();
                for (int i = 0; i < data.n; i++) {
                  System.out.printf((i + 1) + " ");
                  data.strings[i] = scanner.nextLine(); //ругается на ошибку

                }

         case 2:  //кейс с выводом содержимого n строк
                for (int i = 0; i < data.n; i++) {
                    System.out.println(data.strings[i]);
                }
            break;

Класс с переменными:

public class Data {
int n;
String[] strings = new String[n];
}

Код ошибки: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

Заранее спасибо!

Answer 1

Где у вас создается data? Очевидно, что где-то перед вашими кейсами есть строка Data data = new Data(); И тут то и создается объект, в котором инициализируется массив String[] strings = new String[n];. Но поскольку n имеет дефолтное значение (0), то и массив создается нулевой длины. Соответственно, доступ к его элементам получить нельзя, т.к. их там нет. Вам нужно в классе Data написать конструктор, в который передавать n и тут же инициализировать массив стрингов.

Основной класс:

    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    Data data = null;
    while (true) {
        System.out.println("Input 1 or 2:");
        int option = scanner.nextInt();
        scanner.nextLine();
        switch (option) {
            case 1: // кейс с вводом содержимого n строк
                System.out.print("Введите количество строк: ");
                if (scanner.hasNextInt()) {
                    data = new Data(scanner.nextInt());
                } else {
                    System.out.print("Введены некорректные данные!");
                    return;
                }
                scanner.nextLine();
                for (int i = 0; i < data.n; i++) {
                    System.out.print((i + 1) + " ");
                    data.strings[i] = scanner.nextLine(); // НЕ ругается на ошибку
                }
                break;
            case 2:  //кейс с выводом содержимого n строк
                if (data != null) {
                    for (int i = 0; i < data.n; i++) {
                        System.out.println(data.strings[i]);
                    }
                }
                break;
        }
    }
}

Класс Data

public class Data {
int n;
String[] strings;
public Data(int n) {
    this.n = n;
    strings = new String[n];
}

}

READ ALSO
Разница дат MomentJs

Разница дат MomentJs

Нигде не смог найти как при вычитании из одной даты другой получить сколько прошло полных лет, полных месяцев и полных днейПо отдельности...

162
Плагин Sublime Text 3

Плагин Sublime Text 3

Всем привет! Есть ли плагин для sublime 3, что бы по выбранному курсором массиву или переменной в которой хранится число, он автоматически выстраивал...

204
Почему работа с датами отличается на локальной машине и в эмуляторах?

Почему работа с датами отличается на локальной машине и в эмуляторах?

Столкнулся с проблемой, что консоль возвращает разный результат в браузере и REPL

173