在看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. }