finally语句后面的语句到底会不会执行,什么情况下会执行呢//代码换成注释后的输出也不理解- -
public class J_Test {
public static void mb_createException()
{
throw new ArrayIndexOutOfBoundsException();
}public static void mb_method()
{
try
{
mb_createException();
System.out.print("a");
}
catch (Exception e)//第二种做法:Exception换成ArithmeticException
{
System.err.print("b");
}
finally
{
System.out.print("c");
}
System.out.print("d");//为什么第二种做法的时候,这句没有被执行???
}
public static void main(String args[])
{
try
{
mb_method();
}
catch (ArithmeticException e)//第二种做法:ArithmeticException换成Exception
{
System.err.print('m');
}
finally
{
System.out.print('n');
}
System.out.print('x');
}

}

解决方案 »

  1.   

    答:不一定。要看具体情况。
    1)若try{}中没有抛出任何异常,则执行完finally{}之后,finally后边的语句会继续执行。
    2)若try{}中抛出异常,且该异常被自己的catch子句捕获,则先执行相应的catch子句,然后再执行finally{},finally后边的语句会继续执行。
    3)若try{}中抛出异常,且该异常没有被自己的catch子句捕获,则先执行finally{},然后该异常将继续向外抛出,此时,该finally后边的语句将不会得到执行
      

  2.   

    第二种情况在调用mb_createException()方法的时候throws出了一个异常,中断了程序的执行,就相当于在try块中放入了一个return语句一样,在这种情况下执行完finally块中代码以后直接抛出异常中断运行,所以System.out.println("d");这句代码就不会被执行了。
      

  3.   

    finally不管如何都会执行。
    第一种做法,catch接住异常,并把它吞掉,下面继续执行
    第二种做法,catch没有接住异常,到finally执行完,异常就被抛出函数,所以finally后面的没有执行
      

  4.   

    /*
     * 1.main方法调用 mb_method()方法, mb_method()方法调用mb_createException时候抛出了一个异常,try将其捕获
     * 执行catch中的语句打印"b"
     * 2.执行finally语句执行c
     * 3.跳出try代码块,执行输出d
     * 4.mb_method方法结束,由于mb_method将异常处理掉了所有main捕获不到异常,但是还要走try中的finally语句打印输出
     * n
     * 5.跳出try打印输出x
     * total :bcdnx 拥有你的b是用System.err.print("b");输出 所以错误输出显示在最后红色显示
     * */
      

  5.   

    我发现问题所在了,把err 换成 out 打印顺序就正常了
      

  6.   


    谁能解释下为什么err那个红色的输出位置会改变的啊?
      

  7.   

    我查过一些书了 书上都没有讲到 这个err输出的顺序会随机改变的问题诶,
    麻烦知道的大牛们回答一下吧,万分感谢呐~~~
      

  8.   

    譬如下面代码的输出 运行结果会改变的 有时候mcnx,有时候又cnxm 请问这是怎么回事呀?public class J_Test {
    public static void mb_createException()
    {
    throw new ArrayIndexOutOfBoundsException();
    }public static void mb_method()
    {
    try 
    {
    mb_createException();
    System.out.print("a");
    }
    catch (ArithmeticException e)//(Exception e)
    {
    System.err.print("b");
    }
    finally
    {
    System.out.print("c");
    }
    System.out.print("d");
    }
    public static void main(String args[])
    {
    try
    {
    mb_method();
    }
    catch (Exception e)//(ArithmeticException e)
    {
    System.err.print('m');
    }
    finally
    {
    System.out.print('n');
    }
    System.out.print('x');
    }

    }
      

  9.   

    1)若try{}中没有抛出任何异常,则执行完finally{}之后,finally后边的语句会继续执行。
    2)若try{}中抛出异常,且该异常被自己的catch子句捕获,则先执行相应的catch子句,然后再执行finally{},finally后边的语句会继续执行。
    3)若try{}中抛出异常,且该异常没有被自己的catch子句捕获,则先执行finally{},然后该异常将继续向外抛出,此时,该finally后边的语句将不会得到执行。
    按照这个规则,你可以去查查你的程序,看你得异常到底是如何处理的?
      

  10.   


    为什么输出顺序不一样,还是米有人回答诶 很遗憾~ >_<!
      

  11.   

    不可能。无论运行多少次,在我的电脑上都是输出:cmnx屏幕截屏:D:\>javac J_Test.javaD:\>java J_Test
    cmnx
    D:\>java J_Test
    cmnx
    D:\>java J_Test
    cmnx
    D:\>java J_Test
    cmnx
    D:\>java J_Test
    cmnx
    D:\>java J_Test
    cmnx
    D:\>java J_Test
    cmnx
    D:\>
      

  12.   

    其实9楼就说出来了,把catch里的System.err换成System.out应该就解决了,问题是err和out是两个不同的OutputStream,查了一下API里关于System.err里有一句"this output stream is used to display error messages or other information that should come to the immediate attention of a user",应该不同的jvm和机器环境对两者的输出优先可能有区别吧,所以out负责输出的cnx序列是不会变的,err输出的m有可能间插在cnx之间的任何地方。ps:做法二我试了n次都是cmnx
      

  13.   

    啊 不好意思 这几天没上这里来看。
    可是输出顺序会变千真万确,cmnx的概率是最大的。多试几次,一定会出现不同输出的。
    郁闷 问老师他总是推脱着不讲。俺继续去问= =。
      

  14.   

    嗯 这个解释蛮神奇,我也不清楚我的机器环境,反正是eclipse的= =
      

  15.   

    finally在一种情况下不会执行,其他任何时候都会执行。这种特例就是在try-catch任意一个中调用System.exit(0)
      

  16.   

    呃 不对 我运行了一下发现cnxm概率比较大。这悲剧了 咋这么不一样呢,可能真的和编译平台有关系吧= =。