如何在Java中解决线程错误中的异常(ArrayIndexOutOfBoundsException)?

时间:2018-09-23 17:51:31

标签: java arrays do-while

此代码用于输入n integer值并计算编号。这些输入值中的evenodd中的值。

此Java代码在使用ArrayIndexOutOfBoundsException循环时显示do..while,但是在使用for循环时运行良好。只需更改语法即可将for循环转换为do while循环。

对于循环:

import java.util.*;

public class EvenOddCount
{
    public static void main(String args[]) throws Exception
{
    System.out.print("Enter the no. of inputs to be taken : ");
    int evenCount=0, oddCount=0;
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int a[] = new int[n];
    System.out.println("Enter the inputs : ");
    for(int i=0;i<n;i++)
        a[i] = sc.nextInt();
    for(int i=0;i<a.length;i++)
    {
        if(a[i]%2==0)
            evenCount++;
        else 
            oddCount++;
    }
    System.out.println("\nThe number of even numbers in input numbers are : "+evenCount);
    System.out.println("The number of odd numbers in input numbers are : "+oddCount);
}
} 

上面的代码可以正常工作并提供适当的输出。

做...在循环时

import java.util.*;

public class EvenOddCount
{
public static void main(String args[]) throws Exception
{
    System.out.print("Enter the no. of inputs to be taken : ");
    int evenCount=0, oddCount=0, i=0;
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int a[] = new int[n];
    System.out.println("Enter the inputs : ");
    do
    {
        a[i] = sc.nextInt();
        i++;
    } while (i<n);
    do
    {
        if(a[i]%2==0)
            evenCount++;
        else 
            oddCount++;
        i++;
    } while (i<a.length);
    System.out.println("\nThe number of even numbers in input numbers are : "+evenCount);
    System.out.println("The number of odd numbers in input numbers are : "+oddCount);
}
} 

上面的代码具有运行时异常,即

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at EvenOddCount.main(EvenOddCount.java:20)

2 个答案:

答案 0 :(得分:5)

在原始代码中,您有两个单独的i变量:

for(int i=0;i<n;i++)
...

for(int i=0;i<a.length;i++)

在您的do/while版本中,您有一个 i变量。完成第一个循环后,i的值将为n-但您从第二个循环开始而未将其重置为0,因此在第一次迭代时,它将不存在范围。

您可以通过添加以下内容来解决此问题:

i = 0;

就在第二个do / while循环之前,但是请注意,如果{{1} }为0,因为直到迭代结束才检查条件。如果您使用:

n

while (i < n)

相反,它将在第一次迭代之前检查条件,因此它将在while (i < a.length) 为0时执行0次。(尽管您仍然需要在第二个循环之前将n重置为0。)

答案 1 :(得分:0)

U需要重置i的值:

do
{
    a[i] = sc.nextInt();
    i++;
} while (i<n);
i =0;
do
{
    if(a[i]%2==0)
        evenCount++;
    else 
        oddCount++;
    i++;
} while (i<a.length);