为什么数组下标超标编译也不报错?
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编译器可能不完全一样,但应该是大同小异的。
------解决方案--------------------
------解决方案--------------------4楼回答的还是比较对的。
分清楚检查异常和运行时异常就行了。
------解决方案--------------------
------解决方案--------------------编译的时候,应该只检查语法咯,你的语法对着的,所以编译通过撒。
------解决方案--------------------恩,編譯時主要是檢查語法是否存在異常...