在拆分字符串时避免数组索引超出绑定异常

时间:2014-12-03 05:39:32

标签: java string split substring

我正在尝试读取文件并逐行拆分字符串。这是文件中的示例字符串

Decorative Platters--------Home & Kitchen->Home & Décor->Home Décor Accents
Hookah--------Watches & Jewellery->Fashion Jewellery->Bangles
hookah--------

在这种情况下,第三行在点之后没有任何东西。

private static void getCategoriesFromFileAndMAtch()  {
    try {
        BufferedReader br=new BufferedReader(new FileReader("mapping_log"));
        String eachLine;
        while((eachLine = br.readLine()) != null)
        {
            String input1, input2, tempString;
            input1=eachLine.split("--------")[0];
            tempString=eachLine.split("--------")[1];
            if(!(eachLine.split("--------")[1].isEmpty()))
            {
                tempString=eachLine.split("--------")[1].split("::=>")[0];
                System.out.println(input1+"   "+tempString);
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();        
    }

}

因为[1]的值为空我得到异常并且程序停止。我怎么能避免这种情况?我在if循环中检查它是否为空。这还不够吗?

3 个答案:

答案 0 :(得分:2)

当您编写以下行时,您假设该元素存在,但在您的情况下根本不存在,并且if语句本身会因异常而爆炸。

if(!(eachLine.split("--------")[1].isEmpty()))

相反,请检查split()的返回值的长度。

if(eachLine.split("--------").length > 1)

答案 1 :(得分:1)

建议:

  1. 不要做tempString = eachLine.split(" --------");多次,每次执行此操作时,它会一次又一次地分割线(昂贵的操作)。因此,总是,拆分一次并尝试重复使用以下示例中提到的结果。
  2. 如果数组长度未知,请使用array.length查找并添加适当的条件。
  3. 样品:

    String input1, input2, tempString;
    String [] parts = eachLine.split("--------");
    input1 = parts[0];
    
    if (parts.length > 1) {
        input2 = parts[0];
        tempString=input2.split("::=>")[0];
        System.out.println(input1 + "   " + tempString);
    }
    

答案 2 :(得分:0)

对于第三种情况,eachLine.split("--------")将返回长度为1的数组,因此当您访问索引为1的数组时,即     eachLine.split("--------")[1]它给出了一个例外。您可以先检查split函数返回的数组是否大于1

if(eachLine.split("--------").length > 1 && !(eachLine.split("--------")[1].isEmpty()))
{
 tempString=eachLine.split("--------")[1].split("::=>")[0];
 System.out.println(input1+"   "+tempString);
}