0

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 条件本身。

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

4

5 回答 5

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]);
    }
于 2013-07-29T11:58:28.490 回答
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]);

您的xandy可能不包含i.

向我们展示您的Model类,特别是属性x以及y如何初始化它们。

于 2013-07-29T11:50:00.070 回答
1

引发IndexOutOfBoundsException以指示某种索引(例如数组、字符串或向量)超出范围。

在您的情况下,我认为以下代码行有问题,

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

coords.length你应该在访问它之前检查它的长度。

于 2013-07-29T11:50:58.517 回答
0

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

将您的 if 语句更改为:

if (coords.length >= 2) {
    m.x[i] = Float.parseFloat(coords[0]);
    m.y[i] = Float.parseFloat(coords[1]);
}
于 2013-07-29T11:47:34.530 回答
0

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

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

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

于 2013-07-29T11:52:05.727 回答