A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 明锦添 中级黑马   /  2013-3-21 20:11  /  1958 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 明锦添 于 2013-3-22 09:12 编辑

自定义异常时什么时候该定义Exception什么时候什么时候该定义RuntimeException呢?求大神指教

点评

 如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-22 07:55

8 个回复

倒序浏览
Exception是所有异常的超类,RuntimeException也是它的子类,通常没有特殊性的时候都用Exception,RuntimeException则是关于虚拟机运行时的异常,根据不同的需求选择不同的异常类

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
这个基本上没有什么很硬性的规定,现在eclipse基本都有自动添加异常处理机制,如果真要说什么时候用的话  就是想偷懒就用Exception,想在日志文件里面知道具体的错误情况就用各种相对应处理的异常 就是RuntimeException下面的各种子类异常

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Exception中有一个特殊的子类异常runtimeexception运行时异常
如果在函数内容抛出该异常,函数上可以不声明,编译一样通过。
如果在函数上声明了该异常,调用者可以不进行处理,编译一样通过
之所以不用在函数上声明,是因为不需要让调用者处理。
当该异常发生,希望程序终止。因为在运行时,出现了无法继续运算的情况,希望停止后
对代码进行修正。


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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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

额..怎么说呢..我个人的理解是:RuntimeException是在程序运行时抛出的异常,也就是编译期语法是没问题的,到了运行时出现了逻辑错误.所以我觉得一般不会定义RuntimeException,因为出现这个异常就说明你代码写错了....

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
看API吧,上面介绍方法时,有写抛什么异常。{:soso_e128:}
Exception 是所有异常的父类。
回复 使用道具 举报
本帖最后由 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. }  
复制代码
这个毕老师的视频里讲过的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 HM朱蛟 于 2013-3-21 21:13 编辑

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

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

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


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

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
继承RuntimeException类 ,未知的不确定的,只有在运行时才会出现的异常。
而非继承RuntimeException类,一般该类可以预知定义catch,当发生异常后知道如何处理的异常,所以需要捕获。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马