[英]Unable to understand behaviour of Finally Block
我是Java语言的新手,无法理解此程序中finally块的行为。 该程序应在打印BC后退出,而它正在打印BCD。 请帮忙。
class Main
{
public static void main(String [] args)
{
try
{
badMethod();
System.out.print("A");
}
catch (Exception ex)
{
System.out.print("B");
}
finally
{
System.out.print("C");
}
System.out.print("D");
}
public static void badMethod() throws Exception
{
throw new Exception(); /* Line 22 */
}
}
您正在捕获异常(在catch块中)而不是重新抛出它 - 因此您正在有效地处理异常,然后执行就好像它没有被抛出一样。 该程序只退出,因为它到达main
方法的末尾 - 它不像它突然终止。
如果你改变你的代码要么从catch块中重新抛出异常, 要么只是在第一个地方没有捕获它(这两个都需要你声明main
抛出Exception
,当然)然后它不会打印D
没有任何东西可以导致程序退出。
catch
块的重点是捕获异常并防止它进一步传播。
捕获异常后,继续执行。
finally
块没有最终确定程序,它只是确保每次try catch块运行时执行,而有一个例外或不...
如果你在catch
块中重新抛出异常,它将打印BC
。
catch (Exception ex)
{
System.out.print("B");
throw ex;
}
然后你必须声明你的主要
public static void main(String [] args) throws Exception
最后在try / catch块结束时调用。 即使尝试失败并执行catch,它也会被调用。 如果程序以某种方式被杀死(JVM死掉,被迫关闭等),则不会执行Finally
块本身。
在您的示例中,D正在执行,因为它位于try / catch / finally {}块之外。
有上捕捉异常和的try / catch /终于行为一个很好的博客文章在这里 。
哪个是对的。 上面的代码会。
badMethod
并将失败 catch
执行代码 finally
执行代码 在try
或catch
块运行后处理finally
块(取决于是否抛出/捕获异常)。 如果异常都抓住了正确且由处理catch
,它会运行finally
再继续运行该方法的其余部分。
您的程序以下列方式运行:1。调用抛出异常的错误方法2.捕获异常3.执行finally块4.恢复
在Java中,当抛出异常时,如果处理异常,则不一定结束程序执行。 您的程序实际上并不处理异常,但无论如何都会捕获它,这足以让JVM认为可以恢复执行。
输出BCD是非常正确的输出。
最后是java程序必须执行的块。 它允许当前正在运行的程序的所有已分配资源获得释放,并在需要时使其可用于其他应用程序。
这主要用于我们共享数据库或设备等公共资源时。
将finally块视为一个独立的代码块,您仍然希望您的方法继续执行,而不管是否发生异常。
所以在你的情况下, badMethod
抛出一个异常,然后由catch块捕获,然后你的main继续独立执行finally块。
换句话说,如果badMethod
决定不抛出异常,那么finally块仍然会在到达方法结束之前继续执行。
因此,如果最终成为一个独立的块,那么如果愿意的话,可以在主代码中执行类似的操作。
try
{
fooA();
}
finally
{
fooB();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.