Java异常处理中try,catch,finally的各种组合用法

来源:互联网 发布:淘宝客服上下班时间 编辑:程序博客网 时间:2024/06/06 05:58

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



原创粉丝点击