0

我正在逐行解析一个 .CSV 文件,我想获取列的值。以我的 .CSV 文件为例:

time;columnA;columnB,ColumnC
27-08-2013 14:43:00; this is a text; this too; same here

所以我所做的就是将内容存储在一个二维字符串数组中(感谢 split())。我的数组制作如下:

array[0][x] = "time".
array[y][x] = "27-08-2013 14:43:00";

它们是 x 个不同的列,但每列的名称仅存储在 line[0][x] 上。它们是 y 个不同的行,其中的值存储为 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,它也太过分了。为什么?

4

7 回答 7

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.
    }
}
于 2013-08-28T13:43:02.927 回答
1

x < 索引[x].length

问题不在于 的长度index[x],而在于x太大。您需要检查:

index.length < x
于 2013-08-28T13:39:22.307 回答
1

你应该检查一下

x < index[0].length

最好检查一下

index != null && index.length > 0

在访问索引之前。

在您找到正确的结果后,您的代码也会增加“x++”,因此 x 会进一步移动一个元素。如果您现在找到最后一个元素或/没有元素,那么这将设法溢出数组边界,因此

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;
}
于 2013-08-28T13:48:03.823 回答
0

在 while 循环结束时,增加 x 的值。之后,您尝试在 sysout 方法中再次获取该值。

编辑:尝试将 x++ 放在 else 块中。

于 2013-08-28T13:39:39.380 回答
0

您可以使用旧程序

公共类 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);
}

}

输出 ---->>>

x = 1 验证 = 开发真


但是当你声明 static String[][] index = new String[1][3]; 时你必须注意一件事

此处编译器使用 index[0][0]=null 、 index[0][1]=null 、 index[0][2]=null 初始化“索引”

但没有索引[0][3]

所以它会显示 ArrayIndexOutOfBoundsException

所以如果你的程序中有'n'个元素,那么做一件事然后像这样声明'index'

静态字符串[][] 索引 = 新字符串[1][n+1];

于 2013-08-28T14:32:51.567 回答
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 循环,如果您检查数组的长度,它们会更难出现此类错误。

于 2013-08-28T13:59:11.923 回答
0

您完全忽略了数组边界。您在哪里确保在您的 while 循环中您的 x 变量不会太大?无处。

于 2013-08-28T13:39:15.333 回答