ArrayIndexOutOfBoundsException в Java при использовании split - PullRequest
2 голосов
/ 25 марта 2012

Я пытаюсь прочитать файл и разбить его строку, чтобы получить некоторый контекст (имя компьютера и дату), код выдает несколько строк выходных данных, а затем выдает следующее исключение:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
        at FILE_MAIN.getComputerName(FILE_MAIN.java:34)
        at FILE_MAIN.readFiles(FILE_MAIN.java:24)
        at FILE_MAIN.main(FILE_MAIN.java:12)

Код:

import java.util.*;
import java.io.*;
import java.util.Scanner;
public class FILE_MAIN
{
    public static void main(String[] args) throws FileNotFoundException
    {
        File folder = new File("folderName/");
        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++)
        {
            readFiles(listOfFiles[i].getName());
        }
    }
    public static void readFiles(String fileName) throws FileNotFoundException
    {
        FileReader dataFile = new FileReader("yukt/"+fileName);
        try (Scanner FileRead = new Scanner(dataFile)) 
        {
            while (FileRead.hasNextLine() && FileRead.nextLine().isEmpty()==false)
            {
                String[] split;
                String line = FileRead.nextLine();
                split = line.split("\\|",-1);
                String computerName=getComputerName(split[0]);
                System.out.println(computerName);
            }      
        }
    }
    public static String getComputerName(String splited)
    {
        String[] split1;
        String[] split2;
        split1=splited.split("\\:",-1);
        split2=split1[1].split("\\ ",-1);
        return("a");
    }
    public static String getDate(String splited)
    {
        String[] split1=splited.split("\\(",-1);
        String[] split2=split1[1].split("\\ ",-1);
        return(split2[0]);
    }
}

Основная функция получает имена файлов в папке и передает каждый файл в функцию readFiles, где каждая строка делится на 3 части с помощью delimeter (|), а части отправляются в функции getComputerName и getDate, которые возвращают его значения после дальнейшего разделения строк.

Вот пример строки файла, все строки похожи на эту:

[CD8C] ComputerName:NITIN UserID:GO ankurjain Station 9900  LanId: | (11/24 19:50:30) | Client is disconnected from agent.

Ответы [ 4 ]

4 голосов
/ 25 марта 2012

Нет защиты для split1, содержащей один элемент:

split1=splited.split("\\:",-1);
split2=split1[1].split("\\ ",-1); // Accesses second element of split1

Добавьте защиту и решите, является ли ошибкой отсутствие : во входной строке или просто используйте целую строку, если нет ::

split1=splited.split("\\:",-1);
if (split1.length > 1)
{
    split2=split1[1].split("\\ ",-1);
} 
0 голосов
/ 12 ноября 2015

У меня была похожая проблема, когда мне приходилось проверять, какая часть строки погоды содержит заданную строку или нет. Но у рассматриваемой строки было много вариаций. Вместо использования цикла if я использовал троичный оператор -

StringUtils.containsIgnoreCase("Test String",
                    ("split me".split(":").length > 1)
                        ? "split me".split(":")[1] : "Can't split")
0 голосов
/ 25 марта 2012
split1=splited.split("\\:",-1);
split2=split1[1].split("\\ ",-1);

split1 не должен делать то, что вы думаете. то есть это не расщепление, потому что split1 [1] недопустимо.

Вы должны действительно проверить результат первого разделения, прежде чем пытаться использовать его результаты.

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

split2=split1[1] дает вам java.lang. ArrayIndexOutOfBoundsException : 1 ошибка. Массив не имеет 2 элементов, поэтому индекс «1» вызовет ошибку.

Вы можете добавить проверку, чтобы убедиться, что она имеет как минимум 2 элемента, поместив присвоение в оператор if

if (split1.lenght > 1){
  split2=split1[1].split("\\ ",-1);
}  
...