Java学习--异常

根据课上的课件进行练习

1、阅读以下代码(CatchWho.java),写出程序运行结果:

 1 package exception;
 2 
 3 public class CatchWho {
 4     public static void main(String[] args) {
 5         try {
 6             try {
 7                 throw new ArrayIndexOutOfBoundsException();
 8             }
 9             catch(ArrayIndexOutOfBoundsException e) {
10                 System.out.println(  "ArrayIndexOutOfBoundsException" +  "/内层try-catch");
11             }
12 
13             throw new ArithmeticException();
14         }
15         catch(ArithmeticException e) {
16             System.out.println("发生ArithmeticException");
17         }
18         catch(ArrayIndexOutOfBoundsException e) {
19             System.out.println(  "ArrayIndexOutOfBoundsException" + "/外层try-catch");
20         }
21     }
22 }

结果:

ArrayIndexOutOfBoundsException/内层try-catch
发生ArithmeticException

2、写出CatchWho2.java程序运行的结果

 1 package exception;
 2 
 3 public class CatchWho2 {
 4     public static void main(String[] args) {
 5         try {
 6             try {
 7                 throw new ArrayIndexOutOfBoundsException();
 8             }
 9             catch(ArithmeticException e) {
10                 System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
11             }
12             throw new ArithmeticException();
13         }
14         catch(ArithmeticException e) {
15             System.out.println("发生ArithmeticException");
16         }
17         catch(ArrayIndexOutOfBoundsException e) {
18             System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
19         }
20     }
21 }

结果:ArrayIndexOutOfBoundsException/外层try-catch

3、阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结

 1 package exception;
 2 
 3 
 4 class EmbededFinally {
 5     public static void main(String args[]) {
 6 
 7         int result;
 8 
 9         try {
10 
11             System.out.println("in Level 1");
12 
13 
14             try {
15 
16                 System.out.println("in Level 2");
17                 // result=100/0;  //Level 2
18 
19                 try {
20 
21                     System.out.println("in Level 3");
22 
23                     result=100/0;  //Level 3
24 
25                 }
26 
27                 catch (Exception e) {
28 
29                     System.out.println("Level 3:" + e.getClass().toString());
30 
31                 }
32 
33 
34                 finally {
35 
36                     System.out.println("In Level 3 finally");
37 
38                 }
39 
40 
41                 // result=100/0;  //Level 2
42 
43 
44             }
45 
46             catch (Exception e) {
47 
48                 System.out.println("Level 2:" + e.getClass().toString());
49 
50             }
51             finally {
52 
53                 System.out.println("In Level 2 finally");
54 
55             }
56 
57             // result = 100 / 0;  //level 1
58 
59         }
60 
61         catch (Exception e) {
62 
63             System.out.println("Level 1:" + e.getClass().toString());
64 
65         }
66 
67         finally {
68 
69              System.out.println("In Level 1 finally");
70 
71         }
72 
73     }
74 
75 }

结果:

in Level 1
in Level 2
in Level 3
Level 3:class java.lang.ArithmeticException
In Level 3 finally
In Level 2 finally
In Level 1 finally

try捕捉到的异常会从一到二进行抛出,finally的异常会从二到一抛出。

4、finally语句块一定会执行吗?

 1 public class SystemExitAndFinally {
 2 
 3     
 4     public static void main(String[] args)
 5     {
 6         
 7         try{
 8 
 9             
10             System.out.println("in main");
11             
12             throw new Exception("Exception is thrown in main");
13 
14                     //System.exit(0);
15 
16         
17         }
18         
19         catch(Exception e)
20 
21             {
22             
23             System.out.println(e.getMessage());
24             
25             System.exit(0);
26         
27         }
28         
29         finally
30         
31         {
32             
33             System.out.println("in finally");
34         
35         }
36     
37     }
38 
39 
40 }

结果:

in main
Exception is thrown in main

finally不一定会执行。

当程序执行try块,catch块时遇到return语句或者throw语句,这两个语句都会导致该方法立即结束,所以系统并不会立即执行这两个语句,而是 去寻找该异常处理流程中的finally块,如果没有finally块,程序立即执行return语句或者throw语句,方法终止。如果有 finally块,系统立即开始执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的 return或throw语句,如果finally块里也使用了return或throw等导致方法终止的语句,则finally块已经终止了方法,不用 再跳回去执行try块、catch块里的任何代码了。

综上:尽量避免在finally块里使用return或throw等导致方法终止的语句,否则可能出现一些很奇怪的情况!

上一篇:Json数据中的特殊字符处理


下一篇:阿里云centos安装svn和submin