Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我无法修复此问题:java.lang.ArrayIndexOutOfBoundsException_Java - Fatal编程技术网

我无法修复此问题:java.lang.ArrayIndexOutOfBoundsException

我无法修复此问题:java.lang.ArrayIndexOutOfBoundsException,java,Java,当我尝试运行以下代码时,我得到一个“java.lang.ArrayIndexOutOfBoundsException” 我不知道为什么。代码还有其他问题,这就是导致异常的原因: for (int i = 0; i <= length; i++){ 改变改变这个 for (int i = 0; i<= length; i++){ eindWaarden[i] = waarden[i]; } 到 替换 for (int i = 0; i<= length

当我尝试运行以下代码时,我得到一个“java.lang.ArrayIndexOutOfBoundsException”


我不知道为什么。

代码还有其他问题,这就是导致异常的原因:

for (int i = 0; i <= length; i++){
改变改变这个

for (int i = 0; i<= length; i++){
        eindWaarden[i] = waarden[i];
    }

替换

for (int i = 0; i<= length; i++){
    eindWaarden[i] = waarden[i];
}

编辑:

我要出来说出来。此代码返回一个由20个元素组成的字符串数组,其中第一个元素为空,接下来的两个元素将由给定查询返回的最后一行填充。数组中的所有其他元素都为空

由于SQL不一定保证结果的顺序,除非您指定ORDERBY子句,否则每次都可以得到一个随机行

这整件事可以改写为:

final int length = 20;
String[] waarden = new String[20];
final String query = "SELECT rd_datum, rd_locatie FROM racedag LIMIT 1";
ResultSet res = Database.executeSelectQuery(query);

try {
    if (res.next()) {
        waarden[1] = res.getString(1);
        waarden[2] = res.getString(2);
    }
} catch (Exception e) {
    // handle exception
}

return waarden;

这可能不是您想要做的…

您没有显示异常发生的位置,但有一件事,您只是在向waarden[1]和waarden[2]写信,正如我在while循环中声明的那样。我怀疑那是故意的

此外,您的异常处理也很糟糕——只捕获异常而不执行任何操作是一个坏主意,在大多数情况下捕获异常本身也是一个坏主意

还有一个问题:

String eindWaarden[] = new String[length];
for (int i = 0; i<= length; i++) {
    eindWaarden[i] = waarden[i];
}
作为一种风格,这通常是不受欢迎的。将所有类型信息放在一起,就像您为waarden做的那样

如果只使用列表,您的代码会更好:

使用 取代

for (int i = 0; i< length; i++){
    eindWaarden[i] = waarden[i];
}
这就是错误:

for (int i = 0; i<= length; i++){
数组有N个元素,索引从0到N-1

所以正确的答案是:

for (int i = 0; i<length; i++){
ArrayIndexOutOfBoundsException表示您试图访问具有无效索引的数组中的元素。该索引超出范围0到array.length-1

错误在这一行:

for (int i = 0; i<= length; i++){
这应该是:

for (int i = 0; i < length; i++){

在最后一个for循环中,除了其他答案中已经提到的ArrayIndexOutOfBoundsException和@JonSkeet提到的非常糟糕的错误处理之外,还有这段代码

try{
    while (res.next()){
        int i = 1;
        waarden[i] = res.getString(1);
        i++;
        waarden[i] = res.getString(2);
        i++;
    }

    }
catch (Exception e){
        }
finally{
    length = waarden.length;
}

如果只在索引1和索引2处放置值,那么waarden数组的长度为20有什么好的理由吗。查看代码的其余部分,您希望waarden完全填充查询结果,但实际情况并非如此。您可能希望将int i=1移到while循环之外,并将其初始化为0,而不是1。只有当您确定结果的数量永远不会超过10或您的waarden[]太小时,这才有效

最多返回4行,因为数据库仍然是空的。请注意,每次在循环中我都被设置为1。因为数组索引超出了范围?这段代码很可能不会执行您希望它执行的操作。您只保留最后一行的值。如果结果中有多行,您将只看到最后一行的值。您有一个空的catch块:不要这样做!在那里至少放一些日志,否则你会盯着屏幕好几个小时,想知道为什么它不起作用。我应该知道你会编辑你的答案,包括关于waarden[1]和waarden[2]的评论。这样我就不用再提同样的事情了。。。
for (int i = 0; i< length; i++){
    eindWaarden[i] = waarden[i];
}
for (int i = 0; i<= length; i++){
    eindWaarden[i] = waarden[i];
}
for (int i = 0; i< length; i++){
    eindWaarden[i] = waarden[i];
}
for (int i = 0; i<= length; i++){
for (int i = 0; i<length; i++){
for (int i = 0; i<= length; i++){
for (int i = 0; i < length; i++){
try{
    while (res.next()){
        int i = 1;
        waarden[i] = res.getString(1);
        i++;
        waarden[i] = res.getString(2);
        i++;
    }

    }
catch (Exception e){
        }
finally{
    length = waarden.length;
}