public class Demo
{
public static void main(String[] args)
{
try
{
int age=Integer.parseInt("24L");
System.out.println("打印1");
}
catch(NumberFormatException e)
{
int b=8/0;
System.out.println("年龄请输入整数!");
System.out.println("错误:"+e.getMessage());
}
finally
{
System.out.println("打印2");
}
System.out.println("打印3");
}
}
为什么执行结果是:
打印2
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo.main(Demo.java:12)
而不是:
打印2
打印3
觉得最后那句话在最后,不管怎么样都要执行啊!请大家指教下,谢谢啦!
{
public static void main(String[] args)
{
try
{
int age=Integer.parseInt("24L");
System.out.println("打印1");
}
catch(NumberFormatException e)
{
int b=8/0;
System.out.println("年龄请输入整数!");
System.out.println("错误:"+e.getMessage());
}
finally
{
System.out.println("打印2");
}
System.out.println("打印3");
}
}
为什么执行结果是:
打印2
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo.main(Demo.java:12)
而不是:
打印2
打印3
觉得最后那句话在最后,不管怎么样都要执行啊!请大家指教下,谢谢啦!
看看这个吧
int b = 8/0;
的时候遇到算术异常,这个时候本来是应该要终止的,但是有一个finally语句,强制无论是否产生异常都执行
System.out.println("打印2");
语句。执行完后,因为之前产生了算术异常,程序被终止了,所以没有执行最后一句。
try {
try {
int age = Integer.parseInt("24L"); //这里甩出:java.lang.NumberFormatException: For input string: "24L"
System.out.println("打印1");
} catch (NumberFormatException e) {//这里抓住了上面的NumberFormatException
int b = 8 / 0; //这里又甩出java.lang.ArithmeticException: / by zero
System.out.println("年龄请输入整数!");
System.out.println("错误:" + e.getMessage());
} finally {
System.out.println("打印2");//这里先于下面的catch被执行
}
System.out.println("打印3");
} catch (Exception e) {//这里抓住了上面的ArithmeticException
e.printStackTrace();
}
}}
①:除非在try块,catch块中调用了退出虚拟机的方法(System.exit(1)),否则不管在try块,catch块执行怎样的代码,出现怎样的情况,异常处理的 finally块总会被执行。
②再看当程序执行到int age=Integer.parseInt("24L");这句的时候,抛异常NumberFormatException
接着catch(NumberFormatException e)会捕获这个异常,并执行这个try块中的代码,当执行到
int b = 8 / 0 时,又抛异常ArithmeticException,这个时候程序寻找能处理这个异常的catch块,但是很遗憾,程序中没有这样的catch块来处理这个异常,这个时候java运行时环境中止,java程序结束。结合上面说的①,finally快中的语句会被执行,所以结果是
打印2
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo.main(Demo.java:12)
try{
if(true){
throw new RuntimeException("Test");
}
}catch(Exception e){
throw new Exception("Test");
}finally{
System.out.println("This line will always be print!");
}
System.out.println("This line will not be print!"); }
}
1.finally语句块是因为你的NumberFormatException 出现了所以一定会去执行2.不出现" 打印3 ",是因为[ java.lang.ArithmeticException: / by zero ]异常出现且你没有捕获它,故系统就退出了啊
确实:(1) 执行int age=Integer.parseInt("24L");时,发生NumberFormatException异常(2) 在程序转向catch(NumberFormatException)之前,必须执行完finally块。也就是System.out.println("打印2");(3) 在catch块中执行int b=8/0;时候又发生了异常ArithmeticException,但这个时候程序并没有用catch捕捉回这个异常,那么JVM就会把当前执行程序的线程中断,然后交给异常处理器来解决。当前程序完全被终止不在执行了。
异常,执行finally语句块, 打印2,然后报异常
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo.main(Demo.java:12)