Java 为什么这段代码先进入finally,然后进入catch block?

Java 为什么这段代码先进入finally,然后进入catch block?,java,exception-handling,finally,Java,Exception Handling,Finally,在控制台中,我得到以下信息: package testing; public class ExceptionHandling { public static void main(String[] args){ try{ int a=10; int b=0; int c=a/b; ExceptionHandling exp = null; System.out.println(exp);

在控制台中,我得到以下信息:

package testing;

public class ExceptionHandling {
    public static void main(String[] args){
        try{
        int a=10;
        int b=0;
        int c=a/b;
        ExceptionHandling exp = null;
        System.out.println(exp);
        throw new NullPointerException();

        }catch(ArithmeticException e){
            System.out.println("arithmetic issue");
            throw new ArithmeticException();
        }
        catch(NullPointerException e){
            System.out.println("nullpointer");

        }
        finally{

            System.out.println("exception");
            //throw new ArithmeticException();
        }

    }

}

但为什么它最终会先打印块语句,然后再捕获块语句呢?它应该先打印catch block语句,然后再打印block语句。

它不会先运行,
println
的工作方式与异常输出并发。因此,它们可以按不同的顺序打印,而不是先运行,
println
的工作方式与异常输出是并行的。因此他们可以按不同的顺序打印

流程如下:

  • catch
    语句捕获异常,打印消息,但也再次抛出异常
  • 最后执行
    以打印其消息
  • catch
    中抛出的异常被引发,因为从
    catch
    中,它无论如何都没有被处理

  • 流程是这样的:

  • catch
    语句捕获异常,打印消息,但也再次抛出异常
  • 最后执行
    以打印其消息
  • catch
    中抛出的异常被引发,因为从
    catch
    中,它无论如何都没有被处理

  • 控制台中的这一行:

    arithmetic issue
    exception
    Exception in thread "main" java.lang.ArithmeticException
        at testing.ExceptionHandling.main(ExceptionHandling.java:15)
    
    未从
    catch
    块打印。它会在你的程序最终离开后打印出来

    下面是执行过程

  • 异常发生在
    try
  • catch
    捕获该异常
  • 算术问题
    catch
    块打印
  • 下一行重新抛出该异常
  • 您的程序即将离开
    catch
    ,但在离开之前,它最终执行块的代码。这就是为什么您会在控制台中看到word
    exception
    。这就是
    最终设计的工作原理
  • 最后,当您的程序最终离开此方法时,您会在控制台上看到实际的异常

  • 控制台中的这一行:

    arithmetic issue
    exception
    Exception in thread "main" java.lang.ArithmeticException
        at testing.ExceptionHandling.main(ExceptionHandling.java:15)
    
    未从
    catch
    块打印。它会在你的程序最终离开后打印出来

    下面是执行过程

  • 异常发生在
    try
  • catch
    捕获该异常
  • 算术问题
    catch
    块打印
  • 下一行重新抛出该异常
  • 您的程序即将离开
    catch
    ,但在离开之前,它最终执行块的代码。这就是为什么您会在控制台中看到word
    exception
    。这就是
    最终设计的工作原理
  • 最后,当您的程序最终离开此方法时,您会在控制台上看到实际的异常

  • main()
    方法引发的异常
    将由JVM处理和
    由于您在
    catch
    块中重新创建了
    arithmetricexception
    ,并从
    main
    方法中抛出了
    arithmetricexception
    ,因此JVM捕获了
    main()
    方法抛出的
    arithmetricexception
    ,并在控制台上打印了堆栈跟踪

    您的程序流程如下所示:

    (1) 由try块抛出的算术异常

    (2)
    算术异常
    已被
    catch
    块捕获,并重新创建了一个
    新的
    算术异常
    抛出的
    (通过此
    main()
    方法)

    (3)
    最后
    块已执行并打印给定文本

    (4) JVM已捕获此
    main()
    方法引发的
    arithmetricException

    (5) JVM打印了异常的堆栈跟踪

    为了更好地理解这个概念,只需从另一个方法中抛出异常,并从my
    main()
    捕获它,如下所示:

    Exception in thread "main" java.lang.ArithmeticException
        at testing.ExceptionHandling.main(ExceptionHandling.java:15)
    

    但是在您的情况下,您的
    main()
    抛出了异常,JVM捕获了该异常。

    main()
    方法抛出的
    异常将由JVM处理,并且
    由于您在
    catch
    块中重新创建了
    arithmetricexception
    ,并从
    main
    方法中抛出了
    arithmetricexception
    ,因此JVM捕获了
    main()
    方法抛出的
    arithmetricexception
    ,并在控制台上打印了堆栈跟踪

    您的程序流程如下所示:

    (1) 由try块抛出的算术异常

    (2)
    算术异常
    已被
    catch
    块捕获,并重新创建了一个
    新的
    算术异常
    抛出的
    (通过此
    main()
    方法)

    (3)
    最后
    块已执行并打印给定文本

    (4) JVM已捕获此
    main()
    方法引发的
    arithmetricException

    (5) JVM打印了异常的堆栈跟踪

    为了更好地理解这个概念,只需从另一个方法中抛出异常,并从my
    main()
    捕获它,如下所示:

    Exception in thread "main" java.lang.ArithmeticException
        at testing.ExceptionHandling.main(ExceptionHandling.java:15)
    

    但是在您的情况下,您的
    main()
    抛出了异常,JVM捕获了该异常。

    您的输出首先打印
    catch
    块,然后打印
    最后打印
    。你为什么认为它是打印的呢?检查这个答案。另外,您不需要在try块本身中抛出异常。您的输出首先打印
    catch
    块,然后打印
    最后打印
    。你为什么认为它是打印的呢?检查这个答案。另外,您不需要在try块本身中抛出异常。该输出与执行顺序一致。在问题中没有观察到“各种顺序”。@Andreas“输出是由组成的。”