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();
}
}
}
在控制台中我得到了这个:
arithmetic issue
exception
Exception in thread "main" java.lang.ArithmeticException
at testing.ExceptionHandling.main(ExceptionHandling.java:15)
但是为什么它首先打印块语句然后捕获块语句?它应首先打印catch块语句,然后最后阻止语句。
答案 0 :(得分:2)
控制台中的这一行:
Exception in thread "main" java.lang.ArithmeticException
at testing.ExceptionHandling.main(ExceptionHandling.java:15)
未从catch
块打印。在程序最终离开后打印出来。
以下是执行的方式。
try
中发生异常。catch
抓住了这个例外。arithmetic issue
从catch
块打印。catch
,但在它离开之前,它会执行finally块的代码。这就是你在控制台中看到单词exception
的原因。这就是finally
的工作原理。答案 1 :(得分:1)
它没有先运行,println
的工作方式与异常输出同时发生。所以他们可以按各种顺序打印
答案 2 :(得分:1)
这是流程的方式:
catch
语句捕获异常,打印消息但又重新抛出异常finally
块,因此打印其消息catch
引发的异常,因为catch
无法处理它答案 3 :(得分:0)
thrown
方法的异常main()
将由JVM 处理
因为您已在ArithmeticException
块中重新创建catch
,并在thrown
方法中重新main
,所以 JVM抓住了您的ArithmeticException
main()
方法并在控制台上打印堆栈跟踪。
您的计划流程如下:
尝试块(1)ArithmeticException
thrown
(2)ArithmeticException
阻止了catch
阻止,重新创建了new
ArithmeticException
和thrown
(由此main()
方法)
(3)finally
块已执行并打印给定文本
(4)此ArithmeticException
方法抛出的 main()
已被JVM捕获
(5) JVM打印了异常的堆栈跟踪
要更好地理解这个概念,只需throw
来自不同方法的异常,并从我的main()
抓住它,如下所示:
//myOwnMethod throws ArithmeticException
public static void myOwnMethod() {
try{
int a=10;
int b=0;
int c=a/b;
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");
}
}
//main() method catches ArithmeticException
public static void main(String[] args) {
try {
myOwnMethod();
} catch(ArithmeticException exe) {
System.out.println(" catching exception from myOwnMethod()::");
exe.printStackTrace();
}
}
但是在你的情况下,你的main()
抛出异常并且JVM捕获了异常。