日期:2014-05-20  浏览次数:20725 次

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

}

这么写为什么编译不报错呢? 下标明明超标了啊

------解决方案--------------------
运行就报错了啊!
------解决方案--------------------
数组下标越界属于逻辑错误,不是语法错误,所以编译不报错,运行报错,正常的
------解决方案--------------------
因为不是checked exception
------解决方案--------------------
这就是“王八的PP”——规定。

从编译原理来说,编译程序会将代码按顺序点拆分。关于顺序点可以简单的理解成分号(实际情况要更复杂,但这是不讨论的重点)。
在预编译过程中会对声明语句进行分析,记录每个变量的类型,确定在栈中的偏移量,并以此为基准建立符号表。而对变量的赋值信息不会被记录。

之后在实际的编译中,对每个代码分段进行编译。由于优化的缘故,编译顺序未必按实际的顺序进行。各分段的编译具有无关性。

例如,编译到arr[10]=7这个分段时,编译程序能够知道的只有arr的类型以及它的地址。对arr实际指向的实例的相关信息是不知道的。

PS:以上是C编译器编译的基本过程,Java编译器可能不完全一样,但应该是大同小异的。
------解决方案--------------------
探讨
class TestExcption
{
public static void main(String args[])
{
int arr[]=new int[5];

arr[10]=7;

System.out.println("end of main method!!");

}

}

这么写为什么编译不报错呢? 下标明明……

------解决方案--------------------
4楼回答的还是比较对的。
分清楚检查异常和运行时异常就行了。
------解决方案--------------------
探讨
引用:
数组下标越界属于逻辑错误,不是语法错误,所以编译不报错,运行报错,正常的


不会涉及到分配内存出错的问题吗?不会出现数组指针分配出错?

------解决方案--------------------
编译的时候,应该只检查语法咯,你的语法对着的,所以编译通过撒。
------解决方案--------------------
恩,編譯時主要是檢查語法是否存在異常...