jvm finally块是如何工作的?

h22fl7wq  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(160)

在本周的教程中,我发现当java遇到运行时错误时,所有的线程都会停止,但是在finally代码块中,这个事件看起来有点奇怪。

public class main {
  public static void main(String[] args) {

    try {
        Scanner kb = new Scanner(System.in);

        System.out.println("enter number:");
        double val = Double.parseDouble(kb.nextLine());
        double result = MathUtil.myLog(val);
    }
    catch (MyException ex) {
        System.out.println("Cath:foo");
    }
    finally {
        System.out.println("foo:finally");
    }
}

class MathUtil {
  public static double myLog(double val)
{
    if (val < 0)
        throw new MyException();

    if(val == 0)
        throw new YourException();

    return Math.log(val);
}
class MyException extends RuntimeException {

}

class YourException extends RuntimeException {

}

当我执行这段代码并输入一个不正确的条目时,它首先执行finally块,然后我得到runtimeError。

m1m5dgzv

m1m5dgzv1#

缩进工作,不管catch子句是否捕捉到错误,finally就像它说的那样几乎每次都执行。只有当JVM内存不足时它才会执行,但这是罕见的情况

fcipmucu

fcipmucu2#

这是按设计工作的:-)从甲骨文的文档:'finally块总是在try块退出时执行..'对我来说,这意味着finally块将在catch块或其他任何东西执行之前执行。

相关问题