Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 返回方法时ArrayExceptionAutofBounds_Java_Arrays_Debugging_Error Handling - Fatal编程技术网

Java 返回方法时ArrayExceptionAutofBounds

Java 返回方法时ArrayExceptionAutofBounds,java,arrays,debugging,error-handling,Java,Arrays,Debugging,Error Handling,我试图创建一个fillArray方法,它用20个随机值填充和数组,并每三个值求和一次。我在第21行得到一个ArrayExceptionAutofBounds,这是调用该方法的时候。通过调试,我看到数组中填充了正确的值,并且正确计算了总和。我想知道错误是什么 public static void fillArray(){ //adding up A[0], A[3], A[6}, ... double[] A = new double[20]; for(int i = 0

我试图创建一个fillArray方法,它用20个随机值填充和数组,并每三个值求和一次。我在第21行得到一个ArrayExceptionAutofBounds,这是调用该方法的时候。通过调试,我看到数组中填充了正确的值,并且正确计算了总和。我想知道错误是什么

public static void fillArray(){
    //adding up A[0], A[3], A[6}, ...

    double[] A = new double[20];
    for(int i = 0; i < A.length; i++)
        A[i] = Math.random();

    double sum = 0;
    int k = 0;
    do{
        k += 3;
        sum += A[k];
    }while(k < 20);

    System.out.println("sum = " + sum);
}
publicstaticvoidfillarray(){
//将[0],A[3],A[6}。。。
double[]A=新的double[20];
for(int i=0;i
我再次希望确定错误的原因,而不一定是修复错误的方法。

这是您的问题:

do{
    k += 3;
    sum += A[k];
}while(k < 20);
do{
k+=3;
总和+=A[k];
}k<20;
K将等于0,然后是3,然后是6,等等,直到它达到21,然后您尝试访问一个超出边界的[21]


这是因为当while循环的第6次迭代中k=18时,
(k<20)
为true,因此while循环将继续,并向k添加另一个3,使其成为21。之后,while循环停止,因为k不再小于20,k的值为21。

由于在大小为20的数组上命中21,因此会出现错误。要修复此问题,请执行以下操作:

 do{
    k += 3;
    if(k <= 20){
       sum += A[k];
   }
}while(k < 20);
do{
k+=3;

如果(k计算总和的第二个循环是do/while循环,这意味着在执行循环体后,条件将始终得到检查。您以3步向上计数
k
,这意味着在
while(k<20)之前的某个点它将达到21
条件返回false,导致您的错误。

我认为问题在于k正在递增并被用作数组索引,在使用当前逻辑的之前,k将是3,6,9,12,15,18和21。最后一个值负责越界异常。您的循环不会在18处停止,因为它小于20。您可以解决此问题通过将代码更改为以下内容来消除错误:

do{
    k += 3;
    sum += A[k];
}while(k < 18);
do{
k+=3;
总和+=A[k];
}k<18;

在使用数组索引之前先增加数组索引。因此,您不仅在上一步中超出了数组索引,而且也没有在0索引处添加元素。

如果您在调试器中观察过它,那么您已经看到k变为21,并了解了原因。感谢大家的帮助,出于某种原因,我认为当k达到不会叫它的。我犯了个愚蠢的错误。谢谢
do{
    k += 3;
    sum += A[k];
}while(k < 18);