Мне нужна помощь, чтобы понять сообщение об ошибке - PullRequest
0 голосов
/ 09 марта 2012

Вот сообщение об ошибке, которое появляется, когда я пытаюсь отобразить результаты в моей программе.

  Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
   at AddressBookIO.getEntriesString(AddressBookIO.java:38)
   at AddressBookEntryApp.main(AddressBookEntryApp.java:42)

Я почти уверен, что мой код правильный. Моя программа делает все, что должна, кроме отображения моих результатов. "" Main "java.lang.ArrayIndexOutOfBoundsException: 0" - это часть, которая меня смущает.

Вот код для AddressBookIO.java и AddressBookEntryApp

import java.io.*;

public class AddressBookIO
{
private static File addressBookFile = new File("address_book.txt");
private static final String FIELD_SEP = "\t";
private static final int COL_WIDTH = 20;

// use this method to return a string that displays
// all entries in the address_book.txt file
public static String getEntriesString()
{
    BufferedReader in = null;
    try
    {
        checkFile();

        in = new BufferedReader(
             new FileReader(addressBookFile));

        // define the string and set a header
        String entriesString = "";
        entriesString = padWithSpaces("Name", COL_WIDTH)
            + padWithSpaces("Email", COL_WIDTH)
            + padWithSpaces("Phone", COL_WIDTH)
            + "\n";

        entriesString += padWithSpaces("------------------", COL_WIDTH)
            + padWithSpaces("------------------", COL_WIDTH)
            + padWithSpaces("------------------", COL_WIDTH)
            + "\n";

        // append each line in the file to the entriesString
        String line = in.readLine();
        while(line != null)
        {
            String[] columns = line.split(FIELD_SEP);
            String name = columns[0];
            String emailAddress = columns[1];
            String phoneNumber = columns[2];

            entriesString +=
                padWithSpaces(name, COL_WIDTH) +
                padWithSpaces(emailAddress, COL_WIDTH) +
                padWithSpaces(phoneNumber, COL_WIDTH) +
                "\n";

            line = in.readLine();
        }
        return entriesString;
    }
    catch(IOException ioe)
    {
        ioe.printStackTrace();
        return null;
    }
    finally
    {
        close(in);
    }
}

// use this method to append an address book entry
// to the end of the address_book.txt file
public static boolean saveEntry(AddressBookEntry entry)
{
    PrintWriter out = null;
    try
    {
        checkFile();

        // open output stream for appending
        out = new PrintWriter(
              new BufferedWriter(
              new FileWriter(addressBookFile, true)));

        // write all entry to the end of the file
        out.print(entry.getName() + FIELD_SEP);
        out.print(entry.getEmailAddress() + FIELD_SEP);
        out.print(entry.getPhoneNumber() + FIELD_SEP);
        out.println();
    }
    catch(IOException ioe)
    {
        ioe.printStackTrace();
        return false;
    }
    finally
    {
        close(out);
    }
    return true;
}

// a private method that creates a blank file if the file doesn't already exist
private static void checkFile() throws IOException
{
    // if the file doesn't exist, create it
    if (!addressBookFile.exists())
        addressBookFile.createNewFile();
}

// a private method that closes the I/O stream
private static void close(Closeable stream)
{
    try
    {
        if (stream != null)
            stream.close();
    }
    catch(IOException ioe)
    {
        ioe.printStackTrace();
    }
}

   // a private method that is used to set the width of a column
   private static String padWithSpaces(String s, int length)
{
    if (s.length() < length)
    {
        StringBuilder sb = new StringBuilder(s);
        while(sb.length() < length)
        {
            sb.append(" ");
        }
        return sb.toString();
    }
    else
    {
        return s.substring(0, length);
    }
  }
}

И

import java.util.Scanner;

public class AddressBookEntryApp
{
public static void main(String args[])
{
    // display a welcome message
    System.out.println("Welcome to the Address Book application");
    System.out.println();


    Scanner sc = new Scanner(System.in);


    int menuNumber = 0;
    while (menuNumber != 3)
    {
        // display menu
        System.out.println("1 - List entries");
        System.out.println("2 - Add entry");
        System.out.println("3 - Exit\n");

        // get input from user
        menuNumber = Validator.getIntWithinRange(sc, "Enter menu number: ", 0, 4);
        System.out.println();

        switch (menuNumber)
        {
            case 1:
            {
                String entriesString = AddressBookIO.getEntriesString();
                System.out.println(entriesString);
                break;
            }
            case 2:
            {
                // get data from user
                String name = Validator.getRequiredString(sc, "Enter name: ");
                String emailAddress = Validator.getRequiredString(sc, "Enter email address: ");
                String phoneNumber = Validator.getRequiredString(sc, "Enter phone number: ");

                // create AddressBookEntry object and fill with data
                AddressBookEntry entry = new AddressBookEntry();
                entry.setName(name);
                entry.setEmailAddress(emailAddress);
                entry.setPhoneNumber(phoneNumber);

                AddressBookIO.saveEntry(entry);

                System.out.println();
                System.out.println("This entry has been saved.\n");

                break;
            }
            case 3:
            {
                System.out.println("Goodbye.\n");
                break;
            }
        }
    }
}
}

Ответы [ 6 ]

1 голос
/ 09 марта 2012

Вы пытаетесь получить доступ к первому элементу пустого массива.Он не существует, поэтому вы получаете исключение из времени выполнения.

Массив, к которому вы пытаетесь обратиться, является результатом метода split().Это вернет пустой массив, только если вы передадите строку разделителей: "\t"

Таким образом, должны быть строки, содержащие только табуляции, между которыми ничего нет.

Вместо использования split(), вам следует рассмотреть возможность применения регулярного выражения к каждой строке.Таким образом, вы можете проверить формат строки и , одновременно применяя «группы захвата», чтобы легко извлекать значения для каждого поля, даже если они являются пустыми строками.

Pattern p = Pattern.compile("([^\t]*)\t([^\t]*)\t([^\t]*)");
...
Matcher m = p.matcher(line);
if (!m.matches()) {
  /* The line is invalid; skip it or throw an exception. */
  ...
}
String name = m.group(1);
String emailAddress = m.group(2);
String phoneNumber = m.group(3);
1 голос
/ 09 марта 2012

Возможно, пустая строка в 'address_book.txt'?

1 голос
/ 09 марта 2012

Сообщение об ошибке довольно ясно: 1-й элемент (индекс 0) массива с без элементов был неправильно доступен.

Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: [index is] 0

Например, это вызовет исключение:

int bad = (new int[0])[0]; // no elements :(

Пока все в порядке:

int ok = (new int[1])[0];  // one element, can access it!

Я подозреваю, что это так:

String[] columns = line.split(FIELD_SEP); // empty array?
String name = columns[0];                 // KABOOM!

В любом случае проверьте код в строке , сообщенной в исключении.

at AddressBookIO.getEntriesString ( AddressBookIO.java: 38 )

1 голос
/ 09 марта 2012

Указывает, что к массиву обращались с недопустимым индексом. Индекс либо отрицателен, либо больше или равен размеру массива.

Согласно вашим журналам ошибок ... код в строке №: 38 в AddressBookIO.java вызывает это исключение

Может быть здесь ..

            String name = columns[0];
            String emailAddress = columns[1];
            String phoneNumber = columns[2];

если нет элементов 0, 1 или 2 ..

1 голос
/ 09 марта 2012

Исключение означает, что вы обращаетесь к элементу массива за пределами его размера. Таким образом, вам необходимо предоставить подробную информацию о вашем коде, чтобы вы могли узнать причину проблемы.

0 голосов
/ 09 марта 2012

ArrayIndexOutOfBoundsException выбрасывается при попытке доступа к индексу, размер которого превышает размер указанного массива.

Попробуйте изменить это:

while(line != null)
{
    String[] columns = line.split(FIELD_SEP);
    String name = columns[0];
    String emailAddress = columns[1];
    String phoneNumber = columns[2];

    entriesString += padWithSpaces(name, COL_WIDTH) +
                       padWithSpaces(emailAddress, COL_WIDTH) +
                       padWithSpaces(phoneNumber, COL_WIDTH) +
                       "\n";

    line = in.readLine();
}

на это:

while(line != null)
{
    String[] columns = line.split(FIELD_SEP);
    if (columns.length > 2)
    {
        String name = columns[0];
        String emailAddress = columns[1];
        String phoneNumber = columns[2];

        entriesString += padWithSpaces(name, COL_WIDTH) +
                           padWithSpaces(emailAddress, COL_WIDTH) +
                           padWithSpaces(phoneNumber, COL_WIDTH) +
                           "\n";
    }
    line = in.readLine();
}
...