我正在逐行解析.CSV文件,我想获取列的值。 以我的.CSV文件为例:
time;columnA;columnB,ColumnC
27-08-2013 14:43:00; this is a text; this too; same here
所以我所做的是将内容存储在一个二维的String数组中(感谢split())。 我的数组如下:
array[0][x] = "time".
array[y][x] = "27-08-2013 14:43:00";
它们是x不同的列,但每列的名称仅存储在行[0] [x]上。 它们是不同的行,值存储为String。
我的问题如下,我想得到数据的[x]位置,但是当我尝试访问数组的最后一个[x]元素时。 我收到这封错误消息
java.lang.ArrayIndexOutOfBoundsException: 17
at IOControl.ReadCsvFile.getPosVar(ReadCsvFile.java:22)
at IOControl.ReadCsvFile.<init>(ReadCsvFile.java:121)
at en.window.Main.main(Main.java:48)
显然我正在读书,但是怎么样?
这是我的代码:
//Retrieves the x position of the variable var given as parameter.
private int getPosVar(String[][] index, String var)
{
int x = 0;
boolean cond = false;
while((index[0][x] != null) && (cond != true))
{
if (index[0][x].contains(var) == true)
{
cond = true;
}
x++;
}
System.out.println("x = " +x+ " val = " +index[0][x]);
return(x);
}
我认为可能是因为我没有检查我的x值是否小于整个字符串。 像这样:
x < index[x].length
但实际上我没有改变任何东西,当我给出一个未知的String var
时,它也走得太远了。
为什么呢?
答案 0 :(得分:2)
在使用索引之前检查索引的有效性也是一个好主意:
if ( index == null || index.length == 0 ) return -1;
你的while循环看起来应该更像这样:
while ( x < index[0].length )
{
if ( index[0][x] == null )
{
x++;
continue; // skip possible null entries.
}
if ( index[0][x].contains(var) )
{
System.out.println("x = " + x + ", val = " + index[0][x]);
return x; // return the position found.
}
x++;
}
return -1;
使用for循环(我更喜欢):
for ( int x = 0; x < index[0].length; x++ )
{
if ( index[0][x] == null )
continue; // skip possible null entries.
if ( index[0][x].contains(var) )
{
System.out.println("x = " + x + ", val = " + index[0][x]);
return x; // return the position found.
}
}
答案 1 :(得分:1)
x&lt;指数[X]。长度
问题不在于index[x]
的长度,而是x
过大。你需要检查:
index.length < x
答案 2 :(得分:1)
你应该检查
x < index[0].length
最好检查
index != null && index.length > 0
在访问索引之前。
找到正确的结果后,您的代码也会递增“x ++”,因此x会进一步移动一个元素。 如果现在找到最后一个Element或/ no Element,那么这将设法溢出数组边界,因此
System.out.println("x = " +x+ " val = " +index[0][x]);
会抛出错误。
我建议改变它:
private int getPosVar(String[][] index, String var)
{
int x = 0;
boolean found = false;
if(index == null || index.length == 0 || var == null)
return -1;
while((x < index[0].length))
{
if (index[0][x].contains(var))
{
System.out.println("x = " +x+ " val = " +index[0][x]);
return(x);
}
x++;
}
System.out.println(" var = " + var + " not found");
return -1;
}
答案 3 :(得分:0)
你完全忽略了数组边界。你在哪里确定你的while循环你的x变量不是太大?不通。
答案 4 :(得分:0)
在while循环结束时,增加x的值。之后,您尝试在sysout方法中再次获取该值。
编辑:尝试将x ++放在else块中。
答案 5 :(得分:0)
在检查后,您正在增加值。这导致下一次检查太多了。你可以通过添加这样的制动声明来解决这个问题。
public static void main(String[] args) {
String var = "c";
String[][] index = {{"a","b","c"},{"a","b","c"}};
int x = 0;
boolean cond = false;
while( (index[0][x] != null) && (cond != true) )
{
if (index[0][x].contains(var) == true)
{
cond = true;
break;
}
x++;
}
System.out.println("x = " +x+ " val = " +index[0][x]);
此外,你应该总是尝试使用forloop而不是while循环,如果你检查一个数组的长度,它们会更难以得到这样的错误。
答案 6 :(得分:0)
您可以使用旧程序
public class TwoDStringArray {
static String[][] index = new String[1][3];
public static void main(String[] args) {
index[0][0] = "amal";
index[0][1] = "dev";
int x = 0;
boolean cond = false;
String var = "dev";
while((index[0][x] != null) && (cond != true))
{
if (index[0][x++].equals(var) == true)
{
cond = true;
x--;
}
}
System.out.println("x = " +x+ " val = " +index[0][x] + " "+ cond);
}
}
O / P ----&gt;&gt;&gt;
x = 1 val = dev true
但是你申报时必须注意一件事 static String [] [] index = new String [1] [3];
这里编译器初始化'index' index [0] [0] = null,index [0] [1] = null,index [0] [2] = null
但没有索引[0] [3]
所以它会显示ArrayIndexOutOfBoundsException
如果你的程序中有'n'个元素,那么做一件事情 然后像这样宣布'index'
static String [] [] index = new String [1] [n + 1];