Метод Split, генерирующий исключение IndexOutOfBounds - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь создать телефонный справочник, используя массивы (я должен использовать массивы). Я пытаюсь написать метод для добавления новых записей. Я решил добавить новую запись со строкой, которая будет разбита с помощью метода split на три части (фамилия, инициалы, номер) с вкладками. Когда я попытался провести тестирование метода, мне бросили IndexOutOfBoundsException.

Это addEntry метод

@Override
public void addEntry(String line) {

    String[] entryLine = line.split("\\t");
    String surname = entryLine[0];
    String initial = entryLine[1];
    String number = entryLine[2];

    Entry entry = new Entry(surname, initial, number);
    count++;

    if (surname == null || initial == null || number == null) {
        throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
    }
    if (count == entries.length) {
        Entry[] tempEntries = new Entry[2 * count];
        System.arraycopy(entries, 0, tempEntries, 0, count);
        entries = tempEntries;
    } else {
        int size = entries.length;
        for (int i = 0; i < size - 1; i++) {
            for (int j = i + 1; j < entries.length; j++) {
                String one = entry.getSurname();

                if (one.toLowerCase().compareTo(surname.toLowerCase()) > 0) {
                    Entry tempE = entries[i];
                    entries[i] = entries[j];
                    entries[j] = tempE;
                }
            }

        }
    }
}

Это запись, которую я пытался добавить:

arrayDirectory.addEntry("Smith  SK  005598");

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Если введенное вами String действительно

Smith  SK  005598

, тогда ваше регулярное выражение разбиения

\\t

(вкладка) не может работать, так как части не разделены вкладками.
Вместо этого вам нужно использовать

line.split("\\s+");

Поскольку \s+ будет соответствовать любому количеству пробелов.
Вывод будет правильно давать

[Smith, SK, 005598]

Чтобы каждая часть была разделена табуляцией, вы должны использовать

Smith\tSK\t005598

Только тогда будет работать ваш исходный регулярное выражение.

1 голос
/ 25 марта 2019

Вместо логики:

if (surname == null || initial == null || number == null) 
{
    throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
}

Вы должны проверить, что разделенная строка имеет длину 3:

String[] entryLine = line.split("\\s+");
if (entryLine.length() != 3) 
{
    throw new IllegalArgumentException("...");
}

Поскольку эти переменные не будут нулевыми, доступ к массиву вызовет IOOBошибка.

Кроме того, вы должны ставить

 Entry entry = new Entry(surname, initial, number);
    count++;

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

...