public class Demo
{
    public static void main(String[] args)
    {
         try
         {
            int age=Integer.parseInt("24L");
            System.out.println("打印1");
         }
         catch(NumberFormatException e)
         {
             int b=8/0;
             System.out.println("年龄请输入整数!");
             System.out.println("错误:"+e.getMessage());
         }
         finally
         {
             System.out.println("打印2");
         }
         System.out.println("打印3");
    }
}
为什么执行结果是:
打印2
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Demo.main(Demo.java:12)
而不是:
打印2
打印3
觉得最后那句话在最后,不管怎么样都要执行啊!请大家指教下,谢谢啦!

解决方案 »

  1.   

    有异常的的只会把finally执行完就不会继续执行下去的了
      

  2.   

    http://topic.csdn.net/u/20090114/09/c6e863f8-f1b7-4111-a20b-aff116f9b9a0.html
    看看这个吧
      

  3.   

    我的理解是,程序执行到
    int b = 8/0;
    的时候遇到算术异常,这个时候本来是应该要终止的,但是有一个finally语句,强制无论是否产生异常都执行
    System.out.println("打印2");
    语句。执行完后,因为之前产生了算术异常,程序被终止了,所以没有执行最后一句。
      

  4.   

    把程序改改就容易看清楚了:public class Demo { public static void main(String[] args) {
    try {
    try {
    int age = Integer.parseInt("24L"); //这里甩出:java.lang.NumberFormatException: For input string: "24L"
    System.out.println("打印1");
    } catch (NumberFormatException e) {//这里抓住了上面的NumberFormatException
    int b = 8 / 0; //这里又甩出java.lang.ArithmeticException: / by zero
    System.out.println("年龄请输入整数!");
    System.out.println("错误:" + e.getMessage());
    } finally {
    System.out.println("打印2");//这里先于下面的catch被执行
    }
    System.out.println("打印3");
    } catch (Exception e) {//这里抓住了上面的ArithmeticException
    e.printStackTrace();
    }
    }}
      

  5.   

    finally执行完了就不会再执行了
      

  6.   

    finally  面试10有8 9会问
      

  7.   

    都是int b = 8 / 0;惹的祸
      

  8.   

    try-catch-finally的finally块代码是对try块代码而言的. 在catch块中如果还抛出异常, finally块是不会被执行的.
      

  9.   

    呵呵,我来说下吧,首先要明白的一点是:
    ①:除非在try块,catch块中调用了退出虚拟机的方法(System.exit(1)),否则不管在try块,catch块执行怎样的代码,出现怎样的情况,异常处理的 finally块总会被执行。
    ②再看当程序执行到int age=Integer.parseInt("24L");这句的时候,抛异常NumberFormatException
    接着catch(NumberFormatException e)会捕获这个异常,并执行这个try块中的代码,当执行到
    int b = 8 / 0 时,又抛异常ArithmeticException,这个时候程序寻找能处理这个异常的catch块,但是很遗憾,程序中没有这样的catch块来处理这个异常,这个时候java运行时环境中止,java程序结束。结合上面说的①,finally快中的语句会被执行,所以结果是
    打印2 
    Exception in thread "main" java.lang.ArithmeticException: / by zero 
            at Demo.main(Demo.java:12) 
      

  10.   

    并执行这个catch块中的代码,写错了一点。。不好意思
      

  11.   

    public class CSDN {    public static void main(String[] args) throws Exception {
    try{
    if(true){
    throw new RuntimeException("Test");
    }
    }catch(Exception e){
    throw new Exception("Test");
    }finally{
    System.out.println("This line will always be print!");
    }
    System.out.println("This line will not be print!");    }
    }
      

  12.   


    1.finally语句块是因为你的NumberFormatException 出现了所以一定会去执行2.不出现" 打印3 ",是因为[ java.lang.ArithmeticException: / by zero ]异常出现且你没有捕获它,故系统就退出了啊
      

  13.   


    确实:(1) 执行int age=Integer.parseInt("24L");时,发生NumberFormatException异常(2) 在程序转向catch(NumberFormatException)之前,必须执行完finally块。也就是System.out.println("打印2");(3) 在catch块中执行int b=8/0;时候又发生了异常ArithmeticException,但这个时候程序并没有用catch捕捉回这个异常,那么JVM就会把当前执行程序的线程中断,然后交给异常处理器来解决。当前程序完全被终止不在执行了。
      

  14.   

    不管有没有异常,finally总是要执行的。
    异常,执行finally语句块, 打印2,然后报异常
    Exception in thread "main" java.lang.ArithmeticException: / by zero
            at Demo.main(Demo.java:12) 
      

  15.   

    你的catch语句抛出异常后没办法被处理,而且main方法也没声明异常,所以编译时会出现编译错误。