class TestExcption
{
   public static void main(String args[])
   {
      int arr[]=new int[5];
  
  arr[10]=7;
  
  System.out.println("end of main method!!");
   
   }}这么写为什么编译不报错呢? 下标明明超标了啊

解决方案 »

  1.   

    这就是“王八的PP”——规定。从编译原理来说,编译程序会将代码按顺序点拆分。关于顺序点可以简单的理解成分号(实际情况要更复杂,但这是不讨论的重点)。
    在预编译过程中会对声明语句进行分析,记录每个变量的类型,确定在栈中的偏移量,并以此为基准建立符号表。而对变量的赋值信息不会被记录。之后在实际的编译中,对每个代码分段进行编译。由于优化的缘故,编译顺序未必按实际的顺序进行。各分段的编译具有无关性。例如,编译到arr[10]=7这个分段时,编译程序能够知道的只有arr的类型以及它的地址。对arr实际指向的实例的相关信息是不知道的。PS:以上是C编译器编译的基本过程,Java编译器可能不完全一样,但应该是大同小异的。
      

  2.   


    因为这个错误是在编译时无法捕获的,例如public void set(int [] i){
     i[5]=4;//这个地方编译器其实不知道下标会不会存在5,因为传入的的数组宽度可能会是任何情况。
    }