现在的位置: 首页 > 综合 > 正文

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

2013年10月08日 ⁄ 综合 ⁄ 共 3039字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.