首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

为什么数组上标超标编译也不报错

2012-10-20 
为什么数组下标超标编译也不报错?class TestExcption{public static void main(String args[]){int arr[]

为什么数组下标超标编译也不报错?
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楼回答的还是比较对的。
分清楚检查异常和运行时异常就行了。
[解决办法]
探讨
引用:
数组下标越界属于逻辑错误,不是语法错误,所以编译不报错,运行报错,正常的


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

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

热点排行
Bad Request.