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
,但在离开之前,它最终执行块的代码。这就是为什么您会在控制台中看到wordexception
。这就是最终设计的工作原理
控制台中的这一行:
arithmetic issue
exception
Exception in thread "main" java.lang.ArithmeticException
at testing.ExceptionHandling.main(ExceptionHandling.java:15)
未从catch
块打印。它会在你的程序最终离开后打印出来
下面是执行过程
try
中catch
捕获该异常算术问题
从catch
块打印catch
,但在离开之前,它最终执行块的代码。这就是为什么您会在控制台中看到wordexception
。这就是最终设计的工作原理
由
main()
方法引发的异常将由JVM处理
和
由于您在catch
块中重新创建了arithmetricexception
,并从main
方法中抛出了arithmetricexception
,因此JVM捕获了main()
方法抛出的arithmetricexception
,并在控制台上打印了堆栈跟踪
您的程序流程如下所示:
(1) 由try块抛出的算术异常
(2) 算术异常
已被catch
块捕获,并重新创建了一个新的算术异常
和抛出的
(通过此main()
方法)
(3) 最后
块已执行并打印给定文本
(4) JVM已捕获此main()
方法引发的arithmetricException
(5) JVM打印了异常的堆栈跟踪
为了更好地理解这个概念,只需从另一个方法中抛出异常,并从mymain()
捕获它,如下所示:
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打印了异常的堆栈跟踪
为了更好地理解这个概念,只需从另一个方法中抛出异常,并从mymain()
捕获它,如下所示:
Exception in thread "main" java.lang.ArithmeticException
at testing.ExceptionHandling.main(ExceptionHandling.java:15)
但是在您的情况下,您的main()
抛出了异常,JVM捕获了该异常。您的输出首先打印catch
块,然后打印最后打印。你为什么认为它是打印的呢?检查这个答案。另外,您不需要在try块本身中抛出异常。您的输出首先打印catch
块,然后打印最后打印。你为什么认为它是打印的呢?检查这个答案。另外,您不需要在try块本身中抛出异常。该输出与执行顺序一致。在问题中没有观察到“各种顺序”。@Andreas“输出是由组成的。”