我无法修复此问题:java.lang.ArrayIndexOutOfBoundsException
当我尝试运行以下代码时,我得到一个“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
我不知道为什么。代码还有其他问题,这就是导致异常的原因:
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;
}