黑马程序员技术交流社区

标题: 关于自定义异常中的“抛”和“接” [打印本页]

作者: 卜弦    时间: 2013-10-10 11:36
标题: 关于自定义异常中的“抛”和“接”
本帖最后由 卜弦 于 2013-10-10 14:09 编辑

  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 ArithmeticException//throws FuShuException  //此处为“抛”。
  11. {
  12. if(b<0)
  13. throw new FuShuException("出现了除数为负数了");
  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. try
  25. {
  26. int x = d.div(4,0);
  27. System.out.println("x="+x);
  28. }
  29. catch (RuntimeException e)  //此处为“接”。
  30. {
  31. e.printStackTrace();
  32. }
  33. System.out.println("over");
  34. }
  35. }
复制代码
疑问:我试过如下几种对应情况
  抛                              接                              编译通过否
Exception             Exception e                          通过
Exception             Thowable  e                          通过
Exception             RuntimeException e               否
Exception             ArithmeticException e            否
Exception             FuShuException e                 否
当试到这里的时候我猜想的类型应该是的子类或同一级别。于是又尝试了一下情况又觉得糊涂了
    抛                                      接                                      编译通过否
FuShuException           RuntimeException e                       通过    (这里前者是后者的子类。。。。)
ArithmeticException      RuntimeException e                       通过    (这里前者是后者的子类。。。。
试了这两组之后我觉得应该是我想错了。。。。。。
那么请问各位我是不是转牛角尖了?这两者之间要满足什么样的关系么?

作者: 卜弦    时间: 2013-10-10 13:48
上面的问题纠结了好久。又毕老师视频中关于异常的部分看了一遍。终于明白为什么会出现上面的情况了。
首先,异常分为两种编译时异常(继承Exception)和运行时异常(继承RuntimeException)。自定义的异常只能选择继承其中一种。
如果是继承RuntimeException那么异常是不需要在函数上申明的,也就是说对于程序中的throws语句可要可不要。并且也不需要提供处理(即抛或者try)。
但是Throws语句如果要了的话(也即对函数声明了)那么一定要与RuntimeException对应。而不能写成Throws Exception。这样的写法可谓牛头不对马嘴。也即你抛出的是编译时异常,catch的却是运行时异常。所以才出现了我程序下面的疑问。

不过各位老大和战友竟然直接忽视我的提问。。。。。。。好桑心。。。。。。。!!!!!!!!!!!!!!





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