使用split时Java中的ArrayIndexOutOfBoundsException

时间:2012-03-25 11:03:46

标签: java string split indexoutofboundsexception

我正在尝试读取文件并拆分其行以获取一些上下文(计算机名称和日期),代码提供几行输出然后给出以下异常:

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]);
    }
}

main函数获取文件夹中文件的名称,并将每个文件传递给readFiles函数,其中每行由分隔符(|)分成3部分,部分发送到getComputerName和getDate函数,返回其值在进一步分裂琴弦之后。

以下是文件行的示例,所有行都与此类似:

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

4 个答案:

答案 0 :(得分:4)

对包含单个元素的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);
} 

答案 1 :(得分:0)

split2=split1[1]为您提供java.lang. ArrayIndexOutOfBoundsException : 1错误。该数组没有2个元素,因此1上的索引将引发错误。

你可以添加一张支票,通过将分配放在if语句中来确保它至少包含2个元素

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

答案 2 :(得分:0)

split1=splited.split("\\:",-1);
split2=split1[1].split("\\ ",-1);

split1一定不能做你想的。 即它没有分裂,cos split1 [1]无效。

在尝试使用它的结果之前,你应该检查第一次拆分的结果。

答案 3 :(得分:0)

我有类似的问题,我必须检查天气字符串子部分是否包含给定的字符串。但是有问题的String有很多变化。我没有使用if循环,而是使用了三元运算符 -

StringUtils.containsIgnoreCase("Test String",
                    ("split me".split(":").length > 1)
                        ? "split me".split(":")[1] : "Can't split")