Java中的BufferedReader偶尔出现错误

时间:2013-07-29 11:45:17

标签: java eclipse exception bufferedreader

当我调用此函数时,我得到ArrayIndexOutOfBoundsException,但并非总是如此。在 10次尝试中,我得到错误 3次,剩余的 7次它完全正常。

void readTrainingData(Model m) throws FileNotFoundException  {

    BufferedReader br = null;

    try {
        br = new BufferedReader(new FileReader("training_data.csv"));
    } catch (IOException ex)    {
        throw new FileNotFoundException();
    }

    String line = "";
    int i = 0;
    int j;
    try {
        while((line = br.readLine()) != null)    {
            String[] coords = line.split(",");
            if (coords[0] != null && coords[1] != null) {
                m.x[i] = Float.parseFloat(coords[0]);
                m.y[i] = Float.parseFloat(coords[1]);
            }
            else    {
                System.out.println("Check training_data.csv");
            }

            j = 0;
            i++;
        }        
    } catch (IOException ex)    {
        System.out.println("Problem reading file");
        throw new RuntimeException(ex);
    }
}

错误如下:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at polygonprobability.Util.readTrainingData(Util.java:215)

我无法调试它,因为每当我尝试时,我都不会收到错误。

我彻底困惑。请帮忙。

编辑:我将条件更改为

if (coords[0] != null && coords[1] != null && coords.length == 2)   {
         m.x[i] = Float.parseFloat(coords[0]);
     m.y[i] = Float.parseFloat(coords[1]);
}

第215行碰巧是if条件本身。

即使在更改后,错误仍然存​​在。

5 个答案:

答案 0 :(得分:2)

执行此更改

    if (coords.length == 2 && coords[0] != null && coords[1] != null )   {
             m.x[i] = Float.parseFloat(coords[0]);
         m.y[i] = Float.parseFloat(coords[1]);
    }

答案 1 :(得分:1)

  

当我调用此函数时,我得到一个Array IndexOutOfBoundsException,但并非总是如此。在10次尝试中,我得到了3次错误,其余7次完全正常。

第一个潜在的危险:

if (coords[0] != null && coords[1] != null) 

这里假设coords数组总是有2个元素。

将您的条件更改为:

 // check for coords.length == 2 first inside the if 
 // if the first condition fails , others won't be evaluated for short circuit AND
 if ( coords.length == 2 && coords[0] != null && coords[1] != null)   {
     m.x[i] = Float.parseFloat(coords[0]);
     m.y[i] = Float.parseFloat(coords[1]);
}

第二,

m.x[i] = Float.parseFloat(coords[0]);
m.y[i] = Float.parseFloat(coords[1]);

您的xy可能不包含i值的索引。

向我们展示您的Model课程,特别是属性xy,以及如何将其初始化。

答案 2 :(得分:1)

抛出

IndexOutOfBoundsException表示某种索引(例如数组,字符串或向量)超出范围。

在你的情况下,我认为以下代码行存在问题,

 String[] coords = line.split(",");

在访问之前,您应检查其长度coords.length

答案 3 :(得分:0)

你假设你总是在coords中有一个至少包含两个元素的数组,添加一些代码来验证你确实得到了至少两个元素的数组。

将您的if语句更改为:

if (coords.length >= 2) {
    m.x[i] = Float.parseFloat(coords[0]);
    m.y[i] = Float.parseFloat(coords[1]);
}

答案 4 :(得分:0)

首先检查coords数组的长度然后向前移动

if(coords.lenght()>=2) {
  //here parse your float
}

由于未经检查的长度,您假设coords长度始终为2。