Ошибка java.lang.ArrayIndexOutOfBoundsException: 1

129
19 августа 2018, 01:40
        if (nextLine.contains(STARTS_OF_FRAGMENT)) {
            while(sc.hasNext()) {
                try {
                    nextLine = sc.nextLine();
                    split = nextLine.split("\\t");
                    TIME_IN_MS = split[0];
                    for(i=0;i<10;i++) {
                        int a = map_BD.get(map_track.get(i));
                        if (a == 1) {
                            EKG_1 = split[i+1];
                            System.out.println(EKG_1+" EKG_1");
                        }
                        if (a == 2) {
                            L_FINGER = split[i+1];
                            System.out.println(L_FINGER+" L_Finger");
                        }
                        if (a == 3) {
                            L_FINGER_D = split[i+1];
                            System.out.println(L_FINGER_D+" Палец_L _D");
                        }
                        if (a == 4) {
                            KGR = split[i+1];
                            System.out.println(KGR+" КГР");
                        }
                        if (a == 5) {
                            ABDOMEN = split[i+1];
                            System.out.println(ABDOMEN+" Живот");
                        }
                        if (a == 6) {
                            FZ_A1_L = split[i+1];
                            System.out.println(FZ_A1_L+" Fz-A1_L");
                        }
                        if (a == 7) {
                            PZ_A2_L = split[i+1];
                            System.out.println(PZ_A2_L+" Pz-A2_L");
                        }
                        if (a == 8) {
                            SPO2_L = split[i+1];
                            System.out.println(SPO2_L+" SpO2_L");
                        }
                        if (a == 9) {
                            SPO2_L_D = split[i+1];                      
                            System.out.println(SPO2_L_D+" SpO2_L _D");
                        }
                        if (a == 10) {
                            OEMG = split[i+1];
                            System.out.println(OEMG+" ОЭМГ");
                        }
                    }
                }catch (NumberFormatException ex) {//если строка содержит символы(не цифры, то программа их прoпускает и продолжает работу)
                    continue;
                }
            }   
        }

При проходе по этой части кода возникает ошибка. Всё хорошо считывается при проходе первого фрагмента, дальше же возникает ошибка, возможно дело в пустой строчке?

Файл, с которого читается, выглядит так(маленькая выемка):

10552 0,01175 -0,104375 -0,2375 -0,198364 -0,9125 8,5 6,125 0,761875 -0,26375 -0,0133438 10556 -0,011 -0,105 -0,0875 -0,180054 -0,9375 10,25 6,75 0,741875 -0,26375 -0,0133438 10560 -0,0285 -0,105 0,1 -0,164795 -0,9625 9,25 7,125 0,72125 -0,26375 -0,0133438

// Информация по фрагменту Время(мс) 0 1 2 3 4 5 6 7 8 9 0 -0,00475 -0,104375 0,3 -0,149536 -0,9875 6,75 6,375 0,70125 -0,26375 -0,0133438 4 0,01875 -0,1025 0,45 -0,132751 -1,0125 4,75 4,25 0,680625 -0,264375 -0,0133438 8 0,009 -0,100625 0,525 -0,117493 -1,0375 4,5 1,25 0,660625 -0,264375 -0,0133438

Answer 1
  1. В случаях, когда количество элементов может оказаться разным, массивы нужно использовать очень осторожно, и часто вместо них имеет смысл использовать другие структуры. Ваш код может прочитать строку, содержащую что угодно (в общем случае полезно предполагать, что данные могут поступать из источников, которых вы изначально не предусмотрели, могут содержать комментарии (как у вас), ошибки, формат данных может измениться и т. д), а вы предполагаете, что после разбиения строки по табуляциям она будет содержать не менее 10 элементов с осмысленными данными.
  2. Вы предполагаете, что при чтении нечисловых данных возникнет исключение NumberFormatException -- но откуда оно возьмется? Вы нигде не преобразуете строковые значения в числовые, ведь переменные типа ABDOMEN у вас строковые?

Я бы вообще данные разных участков описал в виде перечисления, элементы такого перечисления могут сами отвечать за обработку своих данных. Из вашего фрагмента неясен контекст, но может быть, что-то в таком роде:

    // Описание данных 
    public enum AreaData {
        EKG_1       ("EKG_1"),
        L_FINGER_D  ("Палец_L_D"),
        KGR         ("КГР"),
        ABDOMEN     ("Живот"),
        FZ_A1_L     ("Fz-A1_L");    // И прочие, какие нужно, подобным образом
        private String caption;
        private String dataValue;
        private AreaData(String caption) { this.caption = caption; }
        // Обработать данные - сохранить у себя и распечатать
        public void acceptData(String value) { 
          dataValue = value;
          System.out.println(caption + ": " + dataValue);
        }
        public String getData() { return dataValue; }
    }
    // Порядок данных в строке. Индекс в массиве соотв. позиции в строке, 
    // элемент массива -- ссылка на тот тип данных, который стоит в этой позиции
    private final AreaData[] dataOrderMap = new AreaData[] {
        AreaData.KGR, AreaData.EKG_1, AreaData.FZ_A1_L, 
        AreaData.L_FINGER_D, AreaData.ABDOMEN, // Поставить нужный порядок и дополнить как нужно 
    };
    // Получает очередную строку из файла или откуда вам надо 
    public void processString(String s) {
      String[] ss = s.split("\t");
      for (int i = 0; i < ss.length; i++) 
        if (i < dataOrderMap.length)         // Данные в этой позиции допустимы
          dataOrderMap[i].acceptData(ss[i]); // Данные отдаются нужному обработчику
        else // иначе ругаемся
          System.out.format("Extra data '%s' at index %d\n", ss[i], i);
    }

При таком подходе к этим данным при необходимости можно будет что-то добавлять, не ломая кода основной обработки. Только надо не забывать перед обработкой очередной строки очистить все данные -- для этого в перечислении можно сделать отдельный статический метод.

READ ALSO
Вопрос по flexbox для RecyclerView

Вопрос по flexbox для RecyclerView

У меня есть RecyclerViewЯ добавил библиотеку от Google на Flexbox и сделал так:

132
Ошибка при компиляции, при включенном ProGuard

Ошибка при компиляции, при включенном ProGuard

Дописав в buildgradle строчку minifyEnabled true , при сборке apk выкидывает ошибку:

180
NPE при отработке выбора элемента списка

NPE при отработке выбора элемента списка

Учусь работать с DrawerLayoutДля обработки выбора элемента списка создал класс DrawerItemClickListener наследующий от ListView

117
Телеграмм и библиотеки

Телеграмм и библиотеки

Я не понимаю разницы между TDLib и TelegramAPIЯ работаю с Java и мне удалось найти реализации: для TDLib и для TlgrmAPI

113