未显示出界限异常并且我的代码仍在运行
import java.util.*;
import java.io.*;
public class pr50
{
static String[] arr;
static int modes;
static int old;
static int[] nums;
public static void main(String[] args) throws IOException
{
Scanner in = new Scanner(new File("pr50.dat"));
int limit = in.nextInt();
in.nextLine();
for(int x = 0; x < limit; x++)
{
arr = in.nextLine().split(" ");
nums = new int[arr.length];
for(int b = 0; b < arr.length; b++)
{
nums[b] = Integer.valueOf(arr[b]);
}
Arrays.sort(nums);
old = 0;
modes = 0;
for(int y = 0; y < nums.length; y++)
{
int current = nums[y];
for(int c = 0; current == nums[y+c] && nums[y+c] < nums.length ; c++)
{
if(old < 1)
modes++;
else
old++;
current = nums[y+x];
}
}
if(modes > 1)
System.out.println(modes + " MODES");
else
System.out.println(modes + " MODE");
}
}
}
这是一个示例文件:
2
56 77 66 22 33 55 66 66 66
80 93 87 72 80 77 43 87 98 99 100
答案 0 :(得分:1)
错误就在这里:
for(int c = 0; current == nums[y+c] && nums[y+c] < nums.length ; c++)
想一想,只有当nums [y + c]时,循环才会至少运行一次
意思是nums [y]&lt; nums.length但是如果在你的数组中,最大的元素大于或等于数组的长度,它将永远不会考虑nums[y+1]
,让我们试试:
1
1 2 3 //lenght = 3
2 MODES
因为在最大元素处,3&lt; 3失败,它不会在下一次循环时运行nums[y+1]
,但如果键入:
1
1 1 1 1 1 1 1 //lenght = 7
最后一个元素是1和1 <1。 7,循环将运行下一个循环并检查nums [6 + 1]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
所以要使它抛出OutOfBoundsException
,最大的元素必须小于行的长度(平均元素数)!
run:
1
0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at test.main(test.java:30)
C:\Users\Fes Nguyen\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 2 seconds)