当我调用此函数时,我得到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条件本身。
即使在更改后,错误仍然存在。
答案 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]);
您的x
和y
可能不包含i
值的索引。
向我们展示您的Model
课程,特别是属性x
和y
,以及如何将其初始化。
答案 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。