黑马程序员技术交流社区

标题: 一个关于异常的问题 [打印本页]

作者: 明锦添    时间: 2013-3-21 20:11
标题: 一个关于异常的问题
本帖最后由 明锦添 于 2013-3-22 09:12 编辑

自定义异常时什么时候该定义Exception什么时候什么时候该定义RuntimeException呢?求大神指教
作者: 张文星    时间: 2013-3-21 20:16
Exception是所有异常的超类,RuntimeException也是它的子类,通常没有特殊性的时候都用Exception,RuntimeException则是关于虚拟机运行时的异常,根据不同的需求选择不同的异常类
作者: 随风而去    时间: 2013-3-21 20:21
这个基本上没有什么很硬性的规定,现在eclipse基本都有自动添加异常处理机制,如果真要说什么时候用的话  就是想偷懒就用Exception,想在日志文件里面知道具体的错误情况就用各种相对应处理的异常 就是RuntimeException下面的各种子类异常
作者: HM汪磊    时间: 2013-3-21 20:28
Exception中有一个特殊的子类异常runtimeexception运行时异常
如果在函数内容抛出该异常,函数上可以不声明,编译一样通过。
如果在函数上声明了该异常,调用者可以不进行处理,编译一样通过
之所以不用在函数上声明,是因为不需要让调用者处理。
当该异常发生,希望程序终止。因为在运行时,出现了无法继续运算的情况,希望停止后
对代码进行修正。


自定义异常时:如果该异常的发生,无法再继续进行运算,
就让自定义异常继承runtimeexception。

作者: 李尧    时间: 2013-3-21 20:29
RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。
其他(IOException等等)这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

额..怎么说呢..我个人的理解是:RuntimeException是在程序运行时抛出的异常,也就是编译期语法是没问题的,到了运行时出现了逻辑错误.所以我觉得一般不会定义RuntimeException,因为出现这个异常就说明你代码写错了....
作者: 桉树    时间: 2013-3-21 20:32
看API吧,上面介绍方法时,有写抛什么异常。{:soso_e128:}
Exception 是所有异常的父类。
作者: HM刘博    时间: 2013-3-21 20:33
本帖最后由 HM刘博 于 2013-3-21 20:39 编辑

Exception异常可以使用针对性的处理方式进行处理,RuntimeException是其子类。
RuntimeException 运行时异常:
如果在函数内容抛出该异常,函数上可以不用声明,编译会通过。
如果在函数上声明了该异常,调用者可以不用进行处理,编译也会通过。
之所以不用在函数声明,是因为不需要让调用者处理,也因为如此,当出现异常后,不需要处理,直接使程序停止时使用RuntimeException。
当该异常发生,程序会停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
  1. class FuShuException extends RuntimeException  
  2. {  
  3.     FuShuException(String msg)  
  4.     {  
  5.         super(msg);  
  6.     }  
  7. }  
  8. class Demo  
  9. {  
  10.     int div(int a,int b)throws Exception//throws ArithmeticException   
  11.     {  
  12.         if(b<0)  
  13.             throw new Exception("出现了除数为负数了");  
  14.         if(b==0)  
  15.             throw new ArithmeticException("被零除啦");  
  16.         return a/b;  
  17.     }  
  18. }  
  19. class ExceptionDemo  
  20. {  
  21.     public static void main(String[] args)   
  22.     {  
  23.                 Demo d = new Demo();  
  24.             int x = d.div(4,-9);//被除数为负数,出现异常,停止运行   
  25.         System.out.println("x="+x);      
  26.                
  27. System.out.println("over");  
  28.     }  
  29. }  
复制代码
这个毕老师的视频里讲过的
作者: HM朱蛟    时间: 2013-3-21 20:45
本帖最后由 HM朱蛟 于 2013-3-21 21:13 编辑

简单的说:
若你遇见没有必要处理,就可以直接终止程序的问题,可以继承RuntimeException,若可以通过一些手段处理后可以纠正当前错误的时候,则可以继承Exception

视频上哪个例子讲的很清楚了,想除数为0,这种人为失误,你觉得还有必要处理吗?参数输错了就是输错了,必须改对,否则不符合现实生活,没有必要再继续运算下去,停掉程序,改成对的参数。

若你觉得还有处理的必要,就可以继承Exception
比如那个蓝屏,冒烟的例子,
蓝屏了,处理下,重启下电脑就OK的问题,这种属于可以处理的范畴。通过重启可以纠正蓝屏这个错误的。
冒烟了,导致上课无法继续,也可以处理,先让学生自习,再给张老师报告这个情况。这些是属于可以应对的错误。


书面的说法:
语法的特点:
Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常。
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。
如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;

为什么要用它:
之所以不用在函数声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,
对代码进行修正。

作者: strawberry2013    时间: 2013-3-21 22:48
继承RuntimeException类 ,未知的不确定的,只有在运行时才会出现的异常。
而非继承RuntimeException类,一般该类可以预知定义catch,当发生异常后知道如何处理的异常,所以需要捕获。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2