我正在研究一个生成随机数的java程序,然后将它们放在一个数组中。然后程序应该通过数组,将偶数和奇数放在两个新数组中,并将它们呈现给用户。该程序还告诉用户数组中有多少奇数和偶数。
我得到" ArrayIndexOutOfBoundsException"在尝试编译此代码时。 有人可以告诉我为什么吗?
import java.util.Scanner;
import java.util.Random;
import java.util.Arrays;
class Randomnumbers
{
public static void main ( String[] args )
{
Random random;
int i;
int numberOfNumbers=0;
int upperRange=999;
int lowerRange=0;
int randomNumber=0;
int even=0;
int odd=0;
int currentOdd=0;
int currentEven=0;
int[] oddNumbers=new int[0];
int[] evenNumbers=new int[0];
Scanner in = new Scanner(System.in);
System.out.println("Please enter how many random numbers you want(0-999)");
numberOfNumbers=in.nextInt();
int[] numbers=new int[numberOfNumbers];
random = new Random();
for (i = 0; i < numbers .length; i++){
randomNumber = random.nextInt(upperRange-lowerRange) + lowerRange;
numbers[i] = randomNumber;
}
System.out.println("\n" +"These are the random numbers:");
System.out.println(Arrays.toString(numbers));
for(i=0; i < numbers .length; i++){
if((numbers[i] % 2) == 0)
{
even = even + 1;
}
else
{
odd = odd + 1;
}
}
evenNumbers=new int[even];
oddNumbers=new int[odd];
for(i=0; i < numbers .length; i++){
if((numbers[i] % 2) == 0)
{
evenNumbers[i]=numbers[i];
}
else
{
// this is the code line the compiler does not like:
oddNumbers[i]=numbers[i];
}
}
System.out.println("The following " +even +" numbers are even:");
System.out.println(Arrays.toString(evenNumbers));
System.out.println("The following " +odd +" numbers are odd:");
System.out.println(Arrays.toString(oddNumbers));
}
答案 0 :(得分:0)
问题是:
oddNumbers[i]=numbers[i];
因为:oddNumbers
中的元素数量与numbers
当您使用索引i
访问数组number
中的元素时,您不小心尝试访问导致{i^th
的{{1}}元素1}}。
修复:至少确保索引oddNumber
和ArrayIndexOutOfBound
例如
i< oddNumber.length
答案 1 :(得分:0)
问题陈述如下。根据生成的随机数,任何一个语句都将生成ArrayIndexOutBoundsException
。
evenNumbers[i]=numbers[i];
oddNumbers[i]=numbers[i];
以下是解决此问题的一些选项:
在
中为evenNumbers和oddNumbers维护单独的索引 for(i=0; i < numbers.length; i++){
if((numbers[i] % 2) == 0)
{
evenNumbers[eIndex++] = numbers[i];
}
else
{
oddNumbers[oIndex++] = numbers[i];
}
}
将List<Integer>
用于oddNumbers&amp; evenNumbers。
List<Integer> oddNumbers = new ArrayList<Integer>();
List<Integer> evenNumbers = new ArrayList<Integer>();
for(i=0; i < numbers.length; i++){
if((numbers[i] % 2) == 0)
{
evenNumbers.add(numbers[i]);
}
else{
oddNumbers.add(numbers[i]);
}
}
答案 2 :(得分:0)
多次运行循环确实不是一个好习惯。
我希望代码只能一次遍历随机数组。
List<Integer> evenNumbers = new ArrayList<>();
List<Integer> oddNumbers = new ArrayList<>();
for (i = 0; i < numbers.length; ++i) {
if (numbers[i] % 2 == 0) {
evenNumbers.add(numbers[i]);
}
else {
oddNumbers.add(numbers[i]);
}
}
您可以从相应List
的大小中获取平均值/赔率总数,然后您可以将它们打印出来,重复它们等等。
当然,这种方法假设您实际上可以使用Java对象而不仅仅是数组。
如果必须使用数组,那么在将evenNumbers和oddNumbers数组分配到:
后,将代码的最后部分更改为int evenIdx = 0;
int oddIdx = 0;
for (i = 0; i < numbers.length; ++i) {
if (numbers[i] % 2 == 0) {
evenNumbers[evenIdx++] = numbers[i];
}
else {
oddNumbers[oddIdx++] = numbers[i];
}
}