黑马程序员技术交流社区

标题: 异常---捕获,处理疑问 [打印本页]

作者: 杨增坤    时间: 2013-9-7 17:50
标题: 异常---捕获,处理疑问
本帖最后由 杨增坤 于 2013-9-8 07:20 编辑
  1. /*自定义的异常*/
  2. class MyDivFuShuException extends Exception {
  3.         public MyDivFuShuException(String message) {
  4.                 super(message);
  5.         }
  6. }

  7. public class ZidingyiException {
  8.         public static void main(String[] args) {
  9.                 try {
  10.                         div(1, -1);
  11.                 } catch (MyDivFuShuException e) {// 这里捕获的是方法中抛出的异常
  12.                         System.out.println(e.getMessage());
  13.                 }
  14.                 try {
  15.                         div1(1, -1);
  16.                 } catch (MyDivFuShuException e) {// 这里捕获自定一的异常,但是方法中没有抛出才异常,不是即使不会出现的异常的,也可以在这里进行捕获呢啊,那为什么还会出错呢
  17.                         System.out.println(e.getMessage());
  18.                 } catch (ArithmeticException e) {// 这里编译不会出错误,这是现有的异常类,捕获不出错误,但是为什么自定义的异常就会出错误呢
  19.                         System.out.println(e.getMessage());
  20.                 }
  21.         }

  22.         /* 自定义的异常 把异常抛出 */
  23.         public static void div(int a, int b) throws MyDivFuShuException {
  24.                 if (b < 0)
  25.                         throw new MyDivFuShuException("自定义的异常,除数不能为零");
  26.                 System.out.println(a / b);
  27.         }

  28.         /* 自定义的异常 在本方法中就把异常抛出 */
  29.         public static void div1(int a, int b) {
  30.                 try {
  31.                         if (b < 0)
  32.                                 throw new MyDivFuShuException("自定义的异常,除数不能为零");
  33.                         System.out.println(a / b);
  34.                 } catch (MyDivFuShuException e) {
  35.                         System.out.println(e.getMessage());
  36.                 }
  37.         }

  38. }
复制代码
请大家帮忙解答一下我的疑问!

作者: 张聪珉    时间: 2013-9-7 18:07
对于自定义的异常,必须在方法上声明异常,或者方法内抛出异常对象,调用者才能捕获,记住这个结论就行了,没必要追根究底啊,我觉得追根究底也没有好处,反正方法不抛自定义的异常调用的时候捕获自定义异常就不能编译通过,其实理解起来也蛮简单的,你想一下一个自定义异常你要不在方法上抛出来,java虚拟机怎么知道调用方法会产生你自定义的异常,它只能知道系统本身自带的异常。
作者: 李锡碧    时间: 2013-9-7 18:11
本帖最后由 李锡碧 于 2013-9-7 18:15 编辑
  1. /*自定义的异常*/
  2. class MyDivFuShuException extends Exception {
  3.         public MyDivFuShuException(String message) {
  4.                 super(message);
  5.         }
  6. }

  7. public class ZidingyiException {
  8.         public static void main(String[] args) {
  9.                 try {
  10.                         div(1, -1);
  11.                 } catch (MyDivFuShuException e) {// 这里捕获的是方法中抛出的异常
  12.                         System.out.println(e.getMessage());
  13.                 }
  14.                 try {
  15.                         div1(1, -1);
  16.                 }
  17.                 /*catch (MyDivFuShuException e) {// 此处自己定义的异常已在方法中被catch处理掉
  18.                         System.out.println(e.getMessage());
  19.                 }*/
  20.                 catch (ArithmeticException e) {// 这里编译不会出错误,这是现有的异常类,捕获不出错误,但是为什么自定义的异常就会出错误呢
  21.                         System.out.println(e.getMessage());
  22.                 }
  23.         }

  24.         /* 自定义的异常 把异常抛出 */
  25.         public static void div(int a, int b) throws MyDivFuShuException {
  26.                 if (b < 0)
  27.                         throw new MyDivFuShuException("自定义的异常,除数不能为零");
  28.                 System.out.println(a / b);
  29.         }

  30.         /* 自定义的异常 在本方法中就把异常抛出 */
  31.         public static void div1(int a, int b) {
  32.                 try {
  33.                         if (b < 0)
  34.                                 throw new MyDivFuShuException("自定义的异常,除数不能为零");
  35.                         System.out.println(a / b);
  36.                 } catch (MyDivFuShuException e) {
  37.                         System.out.println(e.getMessage());
  38.                 }
  39.         }

  40. }
复制代码
也就是说try....catch是为破获别人的exception用的,而throw是自己抛出exception让别人去破获的
div1方法的异常在方法内已被方法中的try catch处理了
作者: 赵凯    时间: 2013-9-7 18:19
自定义异常 前提是继承异常类Exception,如果我们定义的是运行时期异常,继承RuntimeException;
需要将异常的信息,传递给自定义异常的父类,用super(),如果你用try{}catch(){}进行处理,如果在try{}中没有捕获到异常,那么就不会再catch(){}中显示出异常来

作者: 黄炳期    时间: 2013-9-7 18:40
增哥,div1方法中的和主函数的try  catch方法,只留下其中以组就可以了。
div1方法虽然抛出了异常,但是被方法内部捕捉了。抛不到主函数那边去。
也就是说,这个异常对于主函数来说,相当于没有异常。那么定义捕捉方法是没意义的。



作者: 杨增坤    时间: 2013-9-7 19:16
黄炳期 发表于 2013-9-7 18:40
增哥,div1方法中的和主函数的try  catch方法,只留下其中以组就可以了。
div1方法虽然抛出了异常,但是被 ...

我知道,在那里捕获那个自定义异常没有意义,我就是想知道,为什么在捕获不会出现的现有的异常(例如:被零除的异常)就不会出错,但是捕获捕获不会出现的自定义的的异常就会出错呢???

作者: 张文豪    时间: 2013-9-7 22:48
本帖最后由 张文豪 于 2013-9-7 23:11 编辑

31.        /* 自定义的异常 在本方法中就把异常抛出 */

32.        public static void div1(int a, int b) 这里加throws MyDivFuShuException}

33.                try {

34.                        if (b < 0)

35.                                throw new MyDivFuShuException("自定义的异常,除数不能为零");

36.                        System.out.println(a / b);

37.                } catch (MyDivFuShuException e) {

38.                        System.out.println(e.getMessage());

39.                }

40.        }




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