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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© heima_xyu 中级黑马   /  2014-5-7 17:40  /  1437 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public static void main(String[] args) throws Exception {
  2. // TODO Auto-generated method stub
  3. int a=4,b=0;
  4. int c = 0;
  5. try {
  6. c=div(a,b);
  7. }
  8. catch(Exception e)
  9. {
  10. //System.out.println("除零啦");
  11. throw e;
  12. }
  13. finally {
  14. System.out.println("over1");
  15. }
  16. System.out.println("over2");
  17. System.out.println(c);
  18. }
  19. public static int div(int a ,int b)
  20. {
  21. return a/b;
  22. }
  23. }
复制代码

一段简单的异常小代码,执行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Ketangcg.ExceptionDemo.div(ExceptionDemo.java:28)
at Ketangcg.ExceptionDemo.main(ExceptionDemo.java:13)
over1

1.为什么over2没有打印出来

2.将catch语句中的throw e,换成打印语句,
执行结果除零啦
over1
over2
0
3.为什么这样就能打印出over2,
难道throw e有return一样的脱出效果吗

4 个回复

倒序浏览
本帖最后由 张然龙 于 2014-5-7 18:17 编辑


你将检测到的这个异常抛给了虚拟机,虚拟机就自动将你的异常给处理了,虚拟机处理之后你的程序就会停掉,而finally是肯定要执行的语句,所以输出个over1程序就停掉了。

正确的代码如下 ↓


  1. class Demo4
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 // TODO Auto-generated method stub
  6.                 int a=4,b=0;
  7.                 int c = 0;
  8.                 try
  9.                 {
  10.                         c=div(a,b);
  11.                 }
  12.                 catch(Exception e)
  13.                 {
  14.                         System.out.println("除零啦");
  15.                 }
  16.                 finally
  17.                 {

  18.                         System.out.println("over1");
  19.                 }
  20.                 System.out.println("over2");
  21.                 System.out.println(c);
  22.         }
  23.         public static int div(int a ,int b) throws ArithmeticException
  24.         {
  25.                 return a/b;
  26.         }
  27. }
复制代码





评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报 0 1
本帖最后由 NewDemo 于 2014-5-7 18:24 编辑
  1. public static void main(String[] args) throws Exception {
  2.                 // TODO Auto-generated method stub
  3.                 int a = 4, b = 0;
  4.                 int c = 0;
  5.                 try {
  6.                         c = div(a, b);
  7.                 } catch (Exception e) {//首先要清楚try,catch里面的代码都是干嘛的,try:有可能出现问题的代码  
  8.                         //catch:对try里出现的问题进行处理的代码。当catch里放的是打印语句的时候,表示的是try里出现问题后,对问题的处理方式                         //是打印“除零啦”,这样问题就被解决了,所以程序继续向下执行
  9.                         //当catch里放的是throw e语句,表示的是出现问题后将异常e抛给虚拟机,虚拟机拿到异常ArithmeticException发现是                                     //RuntimeException异常的子类,那么程序就直接停掉了,除了finally里的代码,下面其他地方的代码都执行不到
  10.                         // System.out.println("除零啦");
  11.                         throw e;
  12.                 } finally {
  13.                         System.out.println("over1");
  14.                 }
  15.                 System.out.println("over2");
  16.                 System.out.println(c);
  17.         }

  18.         public static int div(int a, int b) {
  19.                 return a / b;
  20.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
在throw e后加入代码 catch (Exception e) {

                        throw e;
                        System.out.println("除零啦");//这句话被报Unreachable code不可达代码 就说明执行throw代码后后面代码就不执行 至于为什么输出了over1 因为fianlly{里面是一定会执行的代码} 只有一种情况不会执行,当执行到System.exit(0);finally
不会执行。


                } finally {
                        System.out.println("over1");
                }

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
一块学习一下……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马