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

问个很基础的问题。。。
本帖最后由 sx451087750 于 2013-09-29 22:24:48 编辑
我知道int a = 2200000000;此语句编译时会报错,但为什么 int a = 100000000*22;却可编译通过,而是在运行时会溢出。请问大侠这是怎么回事?

------解决方案--------------------
运算结果,编译器怎么能知道呢。如果什么都让编译器做,那编译器得多复杂。

2200000000是确定的值不会改变,编译器可以知道是否溢出。
但是运算表达式,编译器是不会去运算的。
------解决方案--------------------
你需要弄清楚编译时异常和运行时异常的区别:
一般编译时异常是指语法,语义之类的检查,编译完成生成目标代码;而运行时异常则是对生成的目标代码进行运行操作,一般的异常包括数组越界空指针异常之类的。
所以对于:int a = 2200000000;编译器在你写代码的时候就会进行检查,这时候会进行报错;
而对于:int a = 100000000*22;编译器没有发现数字越界,它不对运算进行操作,它只检查符不符合语法,语义规范,即此时是不知道a的运算结果的,那么又怎么会报错呢?
------解决方案--------------------
引用:
Quote: 引用:

你需要弄清楚编译时异常和运行时异常的区别:
一般编译时异常是指语法,语义之类的检查,编译完成生成目标代码;而运行时异常则是对生成的目标代码进行运行操作,一般的异常包括数组越界,空指针异常之类的。
所以对于:int a = 2200000000;编译器在你写代码的时候就会进行检查,这时候会进行报错;
而对于:int a = 100000000*22;编译器没有发现数字越界,它不对运算进行操作,它只检查符不符合语法,语义规范,即此时是不知道a的运算结果的,那么又怎么会报错呢?


我对编译器做哪些工作不是很清楚,请问有什么书籍可以推荐的吗?


深入Java虚拟机