黑马程序员技术交流社区

标题: 自定义异常的一个小问题 [打印本页]

作者: 马州州    时间: 2012-7-21 17:36
标题: 自定义异常的一个小问题
本帖最后由 马州州 于 2012-7-22 00:08 编辑

这个自定义的异常,最后会输出那个造成异常的负数,我想问的是b在程序中走的流程,怎么就被getValue()获取到b的值了
  1. class FuShuException extends Exception
  2. {
  3. private int value;
  4. FuShuException()
  5. {
  6. super();
  7. }

  8. FuShuException(String msg,int value)
  9. {
  10. super(msg);
  11. this.value = value;
  12. }
  13. public int getValue()
  14. {
  15. return value;
  16. }

  17. }

  18. class Demo
  19. {
  20. int div(int a ,int b)throws FuShuException
  21. {
  22. if (b<0)
  23. throw new FuShuException("出现了除数是负数的情况--- by fushu",b);//手动通过throw关键字抛出一个自定义异常对象

  24. return a/b;
  25. }
  26. }

  27. class ExceptionDemo3
  28. {
  29. public static void main(String[] args)
  30. {
  31. Demo d = new Demo();
  32. try
  33. {
  34. int x = d.div(4,-1);
  35. System.out.println("x="+x);
  36. }
  37. catch (FuShuException e)
  38. {
  39. System.out.println(e.toString());
  40. System.out.println("被除的负数是:"+e.getValue());
  41. }


  42. System.out.println("over");
  43. }
  44. }
复制代码
这个自定义的异常,最后会输出那个造成异常的负数
26行代码在抛出自定义一场对象的时候抛出了b
我想问的是b在程序中走的流程,怎么就被getValue()获取到b的值了
把大致的流程给我说下,拜谢了

作者: 马州州    时间: 2012-7-21 17:37
额~~~发代码不让改颜色。。。

作者: 张雪磊    时间: 2012-7-21 18:34


b在程序中走的流程是这样的,当执行到第26行,判断b<0为真时,就创建了一个FuShuException 对象,所以用new FuShuException ,并返回到调用这个方法的地方第39行(红色部分)。这行代码是在try{}里,所以这个错误对象就被检测到,并传给了catch(){},catch发现与自己要捕获的错误类型相同(蓝色部分)就它起个名字叫e,相当于 FuShuException e=  new  FuShuException("出现了除数是负数的情况--- by fushu",b)。FuShuException这个类就是你自己定义的异常类在第一行,它在构造时就需要两个参数一个字符串,一个就是int值。所以蓝色部分就把,b作为第二个参数传给了int value(第九行绿色部分),然后赋给了this.value(12行紫色部分)。创建了这个类的对象就可以用这个类里面定义的方法了,所以当执行到第45行,e.getValue()时会调用第一行那个异常类的getValue()方法(第14行)返回b到第45行的e.getValue(),这样b就被打印了。


作者: 灵感    时间: 2012-7-21 20:51
遇到知己了!我今天也是看的day9,倒数第二个视频我看了3遍还是跟哥们你一样卡在这个地方了,同求高手帮帮忙~
作者: 马州州    时间: 2012-7-21 23:58
张雪磊 发表于 2012-7-21 18:34
  • class FuShuException extends Exception
  • {
  • private int value;

  • 谢谢了,看的有点明白了,我再琢磨琢磨,讲的这么细致,强烈要求版主给加分啊
    作者: 曹俊    时间: 2012-7-22 02:23


    楼主:我将您的代码复制下来,并加以更改,您的这段程序才能得以运行,因为你的16行这段代码和34行代码不完整,导致编译时会报错,你在运行我代码时,将16行的注释部分去掉即可运行。
    对于你的问题:这个自定义的异常,最后会输出那个造成异常的负数26行代码在抛出自定义一场对象的时候抛出了b我想问的是b在程序中走的流程,怎么就被getValue()获取到b的值了。
    首先读main主函数,运行if(b<0),发现抛出了一个异常FhuShuException();然后就走了第一步(如图),这个异常就被try检测到了,发现b小于0为-1,需要对它进行处理,于是就将catch就捕捉到了(走了第二步,如图)。而b为-1,就在16行代码中把-1传给了value,21行拿到了这个-1,最后的54行就将这个拿到的-1值打印了出来。

    由于我得画图工具出现了问题,搞了很长时间,才画了出来,只画了一点点,希望能帮助楼主理解,呵呵!
    有不对的地方,希望指正哈{:soso__8961432591078930798_3:}





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