在看android的SystemServer.java 由于不懂JAVA,所以看一点记录一点。
本文主要是针对JAVA的异常处理的一些语句进行分析;
谈不上讲解,因为JAVA还不熟,各种百度,google,归总一下,便成了此文;
try { [tryStatements]}
catch(exception)
{ [catchStatements]}
finally { [finallyStatements]}
参数
tryStatements
可选。可能发生错误的语句。
exception
必选。任何变量名称。exception 的初始值是引发的错误的值。
catchStatements
可选。处理在相关联的 tryStatement 中发生的错误的语句。
finallyStatements
可选。在所有其他的错误过程发生之后被无条件执行的语句。
备注
try...catch...finally 语句提供了一种方法,可处理给定代码块中可能会发生的一些或全部错误,同时仍保持代码的运行。如果发生了程序员没有处理的错误,JScript 只给用户提供它的一般错误信息,就好象没有错误处理一样。
tryStatements 参数包含可能发生错误的代码,
而 catchStatement 则包含了可处理任何发生的错误的代码。
如果在 tryStatements 中发生了一个错误,
则将把程序控制传递给 catchStatements 来处理该错误。
exception 的初始值是发生在 tryStatements 中发生的错误的值。
如果不发生错误,则不执行 catchStatements。
如果在与发生错误的 tryStatements 相关联的 catchStatements 中不能处理该错误,则使用 throw 语句将这个错误传播或重新引发给更高级的错误处理程序。
在执行完 tryStatements 中的语句,并在 catchStatements 的所有错误处理发生之后,可无条件执行 finallyStatements 中的语句。
请注意,即使 try 或 catch 块中出现返回语句,或 catch 块中引发错误,都会执行 finallyStatements 中的代码。
finallyStatments 一定会始终运行。
1.try+catch
程序的流程是:运行到try块中,如果有异常抛出,则转到catch块去处理。然后执行catch块后面的语句
try {
/*
* NotificationManagerService is dependant on MountService,
* (for media / usb notifications) so we must start MountService first.
*/
Slog.i(TAG, "Mount Service");
mountService = new MountService(context);
ServiceManager.addService("mount", mountService);
} catch (Throwable e) {
reportWtf("starting Mount Service", e);
上面语句,就会先执行try块中的code,如果有异常,则抛出转到catch块去处理;之后执行reportWtf语句;
2.try+catch+finally
程序的流程是:运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码。
如果没有异常抛出,执行完try块,也要去执行finally块的代码。然后执行finally块后面的语句
try {
display.systemReady(safeMode, onlyCore);
} catch (Throwable e) {
reportWtf("making Display Manager Service ready", e);
}
// These are needed to propagate to the runnable below.
final Context contextF = context;
3.try+finally
程序的流程是:运行到try块中,如果有异常抛出的话,程序转向执行finally块的代码。那末finally块后面的代码还会被执行吗?不会!因为你没有处理异常,所以遇到异常后,执行完finally后,方法就已抛出异常的方式退出了。
这种方式中要注意的是,由于你没有捕获异常,所以要在方法后面声明抛出异常
没有找到这种方法的code;
共同点:
1.在catch块和finally块中仍然可以再抛出新的异常
例如 throw new Exception("illegal invoked");
如果对于新抛出的异常没有写try的话,则要在方法后面声明抛出异常
反之,如果给catch块或finally块里的异常再套上一层try,catch的话,方法后面就不必声明异常了。 (这两句也没有懂~)
注意点:
每次执行后输出结果的顺序可能都不太相同,这是因为采用不同的流打印的结果,不必太在意
1. public class Test1 {
2.
3. /**
4. * @param args
5. * @throws MyException
6. */
7. public static void main(String[] args) {
8. //public static void main(String[] args) throws MyException {
9.
10. // TODO Auto-generated method stub
11. TestException te = new TestException();
12.
13. /*
14. * try+catch
15. *
16. try{
17. te.test();
18. }catch(MyException e){
19. e.printStackTrace();
20. }
21. System.out.println("after exception");
22. */
23.
24. /*
25. * try+catch+finally
26. *
27. try{
28. te.test();
29. }catch(MyException e){
30. e.printStackTrace();
31. }finally{
32. System.out.println("entry finally block");
33. }
34. System.out.println("after exception");
35. */
36.
37.
38. /*
39. * try+finally
40. *
41. try{
42. te.test();
43. }finally{
44. System.out.println("entry finally block");
45. }
46.
47. System.out.println("after exception");
48. */
49.
50. }
51.
52. }
53.
54. class TestException {
55. void test() throws MyException{
56. throw new MyException("illegal invoked");
57. }
58. }
59.
60. class MyException extends Exception{
61. MyException(String msg){
62. super(msg);
63. }
64. }