java不会捕获OutOfBounds异常

时间:2017-05-24 01:18:22

标签: java

未显示出界限异常并且我的代码仍在运行

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 

1 个答案:

答案 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)