Как я могу предотвратить или обработать java.lang.ArrayIndexOutOfBoundsException в этом коде? - PullRequest
0 голосов
/ 31 марта 2019

Я делаю телефонный справочник с массивами (я должен использовать массивы).Когда я пытаюсь передать строку ввода, которая содержит только фамилию и инициалы (не число) или просто фамилию, я хочу вызвать исключение IllegalArgumentException.Тем не менее, когда я пытался проверить его, вместо этого я получаю ArrayIndexOutOfBoundsException.

Это один из методов addEntry.

@Override
    public void addEntry(String line) throws IllegalArgumentException{

        int size = entries.length;

        String[] newLine = line.split("\\s+");
        String surname = newLine[0];
        String initials = newLine[1];
        String number = newLine[2];

        if (surname.length()<1 || initials.length()<1 || number.length()<1){
            throw new IllegalArgumentException("Please provide a Surname, Initials and a Number");
        }


        Entry newEntry = new Entry(surname, initials, number);

Если я пытаюсь передать методу эту запись: arrayDirectory.addEntry("Lara AL");

Я получаю это сообщение об ошибке:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2

, указывая здесь: String number = newLine[2];

Ответы [ 4 ]

0 голосов
/ 31 марта 2019

Проблема возникает, потому что

String[] newLine = line.split("\\s+");

когда

String line = "Lara   AL";

Оценивает:

String[] newLine = ["Lara", "AL"];

И вы пытаетесь получить доступ к newLine[2],когда newLine содержит только 2 элемента.

Это происходит, потому что шаблон \\s+ соответствует одному или нескольким пробелам.

Чтобы избежать этого, вы можете просто проверить newLine.size() > 2 или настроить свое регулярное выражениена \\s{1} или просто " ", что приведет к разделению на один пробел и выше, что приведет к:

String[] newLine = ["Lara", " ", "AL"];
0 голосов
/ 31 марта 2019

Я думаю, вы должны написать так

String surname =  newLine.length > 0 ? newLine[0] : "";
String initials = newLine.length > 1 ? newLine[1] : "";
String number = newLine.length > 2 ? newLine[2] : "";
0 голосов
/ 31 марта 2019

Перед присвоением переменной проверьте длину массива.Нравится:

@Override
    public void addEntry(String line) throws IllegalArgumentException{

        int size = entries.length;

        String[] newLine = line.split("\\s+");
        if(newLine.length < 3)throw new IllegalArgumentException("Please provide a Surname, Initials and a Number");
        String surname = newLine[0];
        String initials = newLine[1];
        String number = newLine[2];

        if (surname.length()< 5 || initials.length()< 5 || number.length()< 5){
            throw new IllegalArgumentException("Please provide a Surname, Initials and a Number that is atleast 5 char long");
       //do other validations here like number -  is it a number or maybe has dashes and spaces

        }


        Entry newEntry = new Entry(surname, initials, number);
0 голосов
/ 31 марта 2019

Если вы передадите «Lara AL» в качестве входных данных, массив newLine будет инициализирован как

["Lara", "AL"]

и будет иметь длину 2. Вместо индивидуальной проверки длины фамилии, инициалов и номера,Вы можете просто проверить, равна ли длина массива <3 после его инициализации. </p>

String[] newLine = line.split("\\s+");
if (newLine.length < 3) {
    throw new IllegalArgumentException("Please provide a Surname, Initials and a Number");
}
...