class TestExcption
{
public static void main(String args[])
{
int arr[]=new int[5];
arr[10]=7;
System.out.println("end of main method!!");
}}这么写为什么编译不报错呢? 下标明明超标了啊
{
public static void main(String args[])
{
int arr[]=new int[5];
arr[10]=7;
System.out.println("end of main method!!");
}}这么写为什么编译不报错呢? 下标明明超标了啊
在预编译过程中会对声明语句进行分析,记录每个变量的类型,确定在栈中的偏移量,并以此为基准建立符号表。而对变量的赋值信息不会被记录。之后在实际的编译中,对每个代码分段进行编译。由于优化的缘故,编译顺序未必按实际的顺序进行。各分段的编译具有无关性。例如,编译到arr[10]=7这个分段时,编译程序能够知道的只有arr的类型以及它的地址。对arr实际指向的实例的相关信息是不知道的。PS:以上是C编译器编译的基本过程,Java编译器可能不完全一样,但应该是大同小异的。
因为这个错误是在编译时无法捕获的,例如public void set(int [] i){
i[5]=4;//这个地方编译器其实不知道下标会不会存在5,因为传入的的数组宽度可能会是任何情况。
}