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

关于异常概念的一个小疑惑
请帮我看下下面的两个概念有没有问题?

(1)异常,就是指程序在运行时出现不正常的情况

(2)对于异常:分两种:
     1,编绎时被检测的异常(也就是说这个异常是可以被处理的)
     2,编绎时不被检测的异常(运行时异常,RuntimeException及其子类);

既然异常是运行时出现,为什么编译时检测而不是运行时检测呢?
感觉这俩概念好矛盾啊,求解。。。

------解决方案--------------------
引用:
请帮我看下下面的两个概念有没有问题?

(1)异常,就是指程序在运行时出现不正常的情况

(2)对于异常:分两种:
     1,编绎时被检测的异常(也就是说这个异常是可以被处理的)
     2,编绎时不被检测的异常(运行时异常,RuntimeException及其子类);

既然异常是运行时出现,为什么编译时检测而不是运行时检测呢?
感觉这俩概念好矛盾啊,求解。。。


lz,你说的异常的两种定义,在别的地方看到还比较少!
你是不是这个意思:
 1,编绎时被检测的异常,如IO、数据库异常等;
 2,编绎时不被检测的异常,如数组越界空指针等。

至于你的疑问“既然异常是运行时出现,为什么编译时检测而不是运行时检测呢?
这个编译时的检查,是非常有必要的。我们要写出更加健壮的程序,就需要更多的提示:如果能在运行前预知并解决更多的异常,那么程序就会更健壮,因为运行时出现Exception,那就会直接影响生产环境了。
所以JDK也是朝这个方向走的,像JDK1.5的泛型就是为了多加约束,减少运行时的类型转换异常。

------解决方案--------------------
Java中异常分两种

一种为“检查异常”,既是说这种异常必须显示声明在接口签名中,用户代码被强迫处理这种异常。

另一种为“非检查异常”,既是说这种异常不被显示声明在接口签名中,(但是应该被写在java doc里),用户代码可以自行决定是否处理,如果不作处理,则默认继续向上层抛出。

======

关于“检查异常”,有不少争论,我个人倾向于相信“检查异常”理论上的愿望是好的,实际操作除限制了用户代码灵活度,污染了接口签名,外加被到处滥用之外,没有特别积极的意义。


另外回答你的问题,对于程序来说,异常都是运行时发生的。