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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏-玉-彪 中级黑马   /  2012-9-7 18:30  /  1697 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 魏-玉-彪 于 2012-9-7 18:31 编辑
  1. class FuShuException extends Exception
  2. {
  3.         FuShuException(String msg)
  4.         {
  5.                 super(msg);
  6.         }
  7. }

  8. class Demo
  9. {
  10.         int div(int a,int b)throws FuShuException
  11.         {
  12.                 if(b<0)
  13.                         throw new FuShuException("除数为负数");
  14.                 return a/b;
  15.         }
  16. }

  17. class  ExceptionDemo5
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 Demo d = new Demo();

  22.                 try
  23.                 {
  24.                         int x = d.div(4,-1);
  25.                         System.out.println("x="+x);

  26.                 }
  27.                 catch (FuShuException e)
  28.                 {
  29.                         System.out.println(e.toString());
  30.                         return;
  31.                         //System.exit(0);//系统,退出。jvm结束。
  32.                 }
  33.                 finally
  34.                 {
  35.                         System.out.println("finally");//finally中存放的是一定会被执行的代码。
  36.                 }


  37.                 System.out.println("over");
  38.         }
  39. }

复制代码
以上代码中


System.out.println(e.toString());
                        return;
                        //System.exit(0);//系统,退出。jvm结束。
                }
                finally
                {
                        System.out.println("finally");//finally中存放的是一定会被执行的代码。
                }

   请问,Java虚拟机是通过什么机制实现 return;  finally()、  System.exit(0)这三者的优先级的?  
例如,当finally语句在其他语句的后面且出现异常时,Java是如何保证在程序终止之前 执行finally中的语句的?在执行前面的语句是,是如何知道后面有一个finally语句呢?




2 个回复

倒序浏览
本帖最后由 杨习平 于 2012-9-7 18:54 编辑

public class Test7 {
        public static void main(String[] args) {
                // 调用Re()方法并打印输出
                int num = Re();
                System.out.println(num);
        }

        // 定义一个静态的Re()方法
        public static int Re() {
                // 先定义一个int x:并赋初始值
                int x = 10;
                // 异常处理
                try {
                        System.out.println("try");
                        x = 20;
                        // 可能抛异常
                        throw new Exception();

                } catch (Exception e) {
                        System.out.println("catch");
                        // 返回x,在这里编辑器会记住这个数值为20
                        return x;
                } finally {
                        System.out.println("finally");
                        // 编辑器执行到这儿是不会影响到之前的返回值,依然返回20
                        x = 30;
                }
        }

}
所以java虚拟机是按照先后顺序,当然你的问题通过下面语句和上面的例子就明白了
-------------------------------------------------
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理,如果是有return语句,则必须是在finally之后才返回的。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
Finally为确保一段代码不管发生什么"异常"都被执行一段代码。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。
回复 使用道具 举报
稍等一下哈!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马