当我尝试运行以下代码时,我得到一个'java.lang.ArrayIndexOutOfBoundsException
'
ResultSet res = null;
String[] waarden = new String[20];
int length = 0;
String query = "SELECT rd_datum, rd_locatie FROM racedag;";
res = Database.executeSelectQuery(query);
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;
}
String eindWaarden[] = new String[length];
for (int i = 0; i<= length; i++){
eindWaarden[i] = waarden[i];
}
return eindWaarden;
}
我不知道为什么。
答案 0 :(得分:7)
您尚未显示异常发生的位置,但有一件事您只是曾写入waarden[1]
和waarden[2]
(作为i
在while
循环内声明。我怀疑这是故意的。
此外,您的异常处理非常糟糕 - 只是捕获异常并执行 nothing 是一个坏主意,就像在大多数情况下捕获Exception
本身一样。
然后出现了这个问题:
String eindWaarden[] = new String[length];
for (int i = 0; i<= length; i++) {
eindWaarden[i] = waarden[i];
}
这将始终失败,因为您正在访问eindWaarden[length]
,这将不在数组的末尾。有效索引为0
到length - 1
,包括<=
。如果您想保留该循环(我怀疑),请将<
更改为length
。
哦,waarden
总是20,但是你检索的结果很多 - 因为这是String eindWaarden[]
的长度。
此外,虽然此声明有效:
waarden
作为一种风格,它通常是气馁的。将所有类型信息保存在一起,就像您对List<String>
所做的那样。
如果您只使用String query = "SELECT rd_datum, rd_locatie FROM racedag;";
ResultSet res = Database.executeSelectQuery(query);
List<String> results = new ArrayList<String>();
// Removed try block: declare that your method throws SqlException or whatever
while (res.next()) {
results.add(res.getString(1));
results.add(res.getString(2));
}
// Change the method declaration to have a return type of List<String>
return results;
代码,那么您的代码会更好
{{1}}
答案 1 :(得分:1)
更改此
for (int i = 0; i<= length; i++){
eindWaarden[i] = waarden[i];
}
到
for (int i = 0; i< length; i++){
eindWaarden[i] = waarden[i];
}
答案 2 :(得分:1)
ArrayIndexOutOfBoundsException
表示您尝试访问索引无效的数组中的元素(索引超出范围0
到array.length - 1
)。
错误就在这一行:
for (int i = 0; i<= length; i++){
应该是:
for (int i = 0; i < length; i++){
答案 3 :(得分:1)
在最后一个for循环中你说i&lt; = length,我相信它应该只是我&lt;长度
答案 4 :(得分:0)
代码还有其他问题,这就是造成异常的原因:
for (int i = 0; i <= length; i++){
将<=
更改为<
:
for (int i = 0; i < length; i++){
答案 5 :(得分:0)
替换
for (int i = 0; i<= length; i++){
eindWaarden[i] = waarden[i];
}
使用
for (int i = 0; i < length; i++){
eindWaarden[i] = waarden[i];
}
(<
代替<=
)
答案 6 :(得分:0)
修改强>:
我要出来说出来。此代码返回一个20个元素的String
数组,其中第一个元素为空,接下来的两个元素将填充给定查询返回的最后一行。数组中的所有其他元素都是空的。
由于SQL不必然保证结果的顺序(除非您指定ORDER BY
子句),每次都可以得到一个随机行。
这整件事可以改写为:
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;
这可能不是你打算做的......
答案 7 :(得分:0)
在for循环中使用<
代替<=
。否则,您正在尝试访问不存在的索引:
for (int i = 0; i< length; i++){
eindWaarden[i] = waarden[i];
}
答案 8 :(得分:0)
for (int i = 0; i<= length; i++){
eindWaarden[i] = waarden[i];
}
替换为
for (int i = 0; i< length; i++){
eindWaarden[i] = waarden[i];
}
答案 9 :(得分:0)
这是错误:
for (int i = 0; i<= length; i++){
数组有N个元素,索引从0到N-1。
所以正确的是:
for (int i = 0; i<length; i++){
答案 10 :(得分:0)
除了已经在其他答案中解决的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;
}
如果只将值放在索引waarden
和索引20
,那么1
数组的长度为2
是否有任何正当理由。查看代码的其余部分,您希望waarden
完全填充查询结果,但情况并非如此。您可能希望将int i = 1
移到while
循环之外,并在0
而不是1
初始化它。这只有在您确定结果数量永远不会超过10
或waarden[]
太小的情况下才有效