Чтение данных из текстового файла в Android ничего не возвращает? - PullRequest
0 голосов
/ 25 февраля 2012

Это мой первый вопрос, но я постараюсь задать его хорошо. Во всяком случае, я пытаюсь прочитать данные из текстового файла в Android, но по какой-то причине он не возвращает ничего, а именно, исключение IndexOutOfBounds. Весь соответствующий код:

public Question getNextQuestion(int num) {
    Log.d(TAG, array.toString());
    return array.get(num+1);
}
public ArrayList<Question> getData(String str) throws NumberFormatException, IOException {
    Log.d(TAG, "STARTING getData");
    Log.d(TAG, str);
    ArrayList<Question> a = new ArrayList<Question>();
    String[] strline = str.split("//");
    for (int j = 0; j < strline.length; j++) {
        if (strline[j] == null) {
            strline[j] = "TESTING";
            Log.d(TAG, strline[j]);
        }
    }

    int num = 0;
    int x = 0;
    String y = strline[x];
    while (x == 0 || y != null) {
        num++;
        String[] data = y.split("//");
        Log.d(TAG, y);
        if (data.length >= 7) {
            a.add(new Question(Integer.parseInt(data[0]), data[1], data[2], data[3], data[4], data[5], Integer.parseInt(data[6])));
            Log.d(TAG, a.get(a.size()).getText());
        }
        else if (data.length >= 3) {
            a.add(new Question(Integer.parseInt(data[0]), data[1], data[2]));
            Log.d(TAG, a.get(a.size()).getText());
        }
        x++;
        if (x < strline.length)
            y = strline[x];
        else
            break;
    }
    for (int i=0; i<a.size(); i++){
        Log.d(TAG, a.get(i).getText());
    }
    Log.d(TAG, "ENDING getdata");
    return a;
}
public ArrayList<Question> openFile() throws IOException {
    Log.d(TAG, "STARTING openFile()");
    //FileReader fr = new FileReader("data/data/scibowl.prog/questionsb.txt");
    FileInputStream fis;
    String storedString = "";
    try {
        fis = openFileInput("questionsb.txt");
        DataInputStream dataIO = new DataInputStream(fis);
        String strLine = null;

        while ((strLine = dataIO.readLine()) != null) {
            storedString = storedString + strLine;
        }

        dataIO.close();
        fis.close();
    }
    catch  (Exception e) {  
    }

    array = getData(storedString);
    Log.d(TAG, "DID open file, ending openFile()");
    return array;
}

Это напечатает в LogCat:

    onCreate done
STARTING openFile()
STARTING getData
ENDING getdata
DID open file, ending openFile()
right before Toast.makeText
[]
Caused by: java.lang.IndexOutOfBoundsException: Invalid location 1, size is 0
at java.util.ArrayList.get(ArrayList.java:341)
at scibowl.prog.Round.getNextQuestion(Round.java:55)
at scibowl.prog.RoundView.<init>(RoundView.java:26)
at scibowl.prog.Round.onCreate(Round.java:35)

Я перепробовал практически все, от StringBuffers до FileInputStreams и BufferedReaders, и прочитал соответствующую документацию по Android, хотя не стесняйтесь сказать мне, что я не читаю это достаточно сложно. Кто-нибудь знает, почему я продолжаю получать массивы без элементов?

Текстовый файл для справки, хотя и слегка отредактированный в соответствии с правилами цитаты:

1 // О стандартном электромагнитном спектре, какая частота между гамма-лучами и ультрафиолетовыми лучами? // Радиоволны // Микроволны // Рентгеновские лучи // Инфракрасные волны // 1

2 // Какие волны в электромагнитном спектре приблизительно охватывают частоты от 10 ^ 9 Гц до 10 ^ 12 Гц? // Видимый свет // Гамма-лучи // Ультрафиолетовые лучи // Микроволны // 3

3 // Приблизительно, какой процент власти США исходит от угля? // 30% // 40% // 50% // 60% // 0

4 // Если 100-килограммовый человек начинает ходить от отдыха и разгоняется до 4,0 м / с в течение 2 секунд при постоянном ускорении, какую работу он выполняет? // 600 Дж // 800 Дж // 1200 Дж / / 2000 Дж // 1

1 Ответ

1 голос
/ 26 февраля 2012

Ваш logcat предполагает сбой в строке 55 в методе getNextQuestion, который, я считаю, таков:

return array.get(num+1);

Кроме того, ваш logcat предлагает вам получить доступ к значению в массивеэтого не существуетЭто означает, что вы пытаетесь получить элемент по индексу 1 (я полагаю, что это второй элемент), но размер вашего массива равен 0, поэтому нет элементов, которые вы можете получить.

Так что, скорее всего,в getData вы фактически не можете вернуть ArrayList, как вы намеревались.Или ArrayList, который вы возвращаете, пуст.

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