黑马程序员技术交流社区
标题: 关于自定义异常中的“抛”和“接” [打印本页]
作者: 卜弦 时间: 2013-10-10 11:36
标题: 关于自定义异常中的“抛”和“接”
本帖最后由 卜弦 于 2013-10-10 14:09 编辑
- class FuShuException extends RuntimeException
- {
- FuShuException(String msg)
- {
- super(msg);
- }
- }
- class Demo
- {
- int div(int a,int b)throws ArithmeticException//throws FuShuException //此处为“抛”。
- {
- if(b<0)
- throw new FuShuException("出现了除数为负数了");
- if(b==0)
- throw new ArithmeticException("被零除啦");
- return a/b;
- }
- }
- class ExceptionDemo
- {
- public static void main(String[] args)
- {
- Demo d = new Demo();
- try
- {
- int x = d.div(4,0);
- System.out.println("x="+x);
- }
- catch (RuntimeException e) //此处为“接”。
- {
- e.printStackTrace();
- }
- System.out.println("over");
- }
- }
复制代码疑问:我试过如下几种对应情况
抛 接 编译通过否
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 |