java异常处理学习笔记 
  
如果你对异常已经很了解,就不用看了。这是写给初学者看的。 
  
  
基础知识 
在程序运行时,常常会出现一些非正常的现象,这种情况称为运行错误。根据其性质可以分为错误和异常。 
  
错误:常见的有程序进入死循环,内存泄漏等。这种情况,程序运行时本身无法解决,只能通过其他方法干预。对应的类为Error类 
异常:常见的有除数为0,数组越界等。这种情况,不向错误那样,程序运行时本身可以解决,由异常代码调整程序运行方向,使程序仍可继续运行直至正常结束。对应的类为Exception类。 
  
抛出异常:当程序发生异常时,产生一个异常事件,生成一个异常对象,并把它提交给运行系统,再由运行系统寻找相应的代码来处理异常,这个过程称为抛出异常。 
捕获异常:异常抛出后,运行时系统从生成对象的代码开始,沿方法的调用栈逐层回溯查找,直到找到包含相应处理的方法,并把异常对象交给该方法为止,这个过程称为捕获异常。 
  
五大模板 
使用try—catch—finally语句捕获和处理异常 
try                                                                                  try                                                                           try 
{                                                                                     {                                                                              { 
  ……                                                                                    ……                                                                         ……. 
}                                                                                      }                                                                              } 
finally                                                                            catch(Execption e)                                                   catch(Execption e) 
{                                                                                    {                                                                                { 
……                                                                                ……                                                                         ……. 
System.out.system(0);                                              }                                                                                } 
}                                                                                                                                                                      finally 
                                                                                                                                                                        { 
     模板一(不推荐使用)                                             模板二                                                                              ……. 
                                                                                                                                                                         } 
                                                                                                                               模板三 
                                              try                                                                                         try 
                                              {     …….                                                                              { 
                                              }                                                                                                     ……. 
                                               catch(Execption的子类1  e)                                                  } 
                                              {                                                                                              catch(异常类1  e) 
                                              }                                                                                             { 
                                              catch(Execption的子类2  e)                                                              try 
                                              {                                                                                                        { 
                                              }                                                                                                                ……… 
                                              catch(Execption e)                                                                             } 
                                              {                                                                                                         cathch(异常2  e ) 
                                              }                                                                                                         {……..} 
                                              finally                                                                                      } 
                                             {                                                                                               finally 
                                          ……..                                                                               { ………..} 
                                              } 
                            模板四                                                                                     模板五 
图一 五大模板 
对模板的一点解释: 
1.       try语句  当某段代码在运行时可能产生异常的话,应该把这段代码放到try语句中去。但不要把所有的语句放到try语句中,因为粒度太大。 
2.       catch语句  其中的参数类似于方法的声明,包含一个异常类型和一个异常对象。异常类型必须是Throwable类的子类,当然也可以是自己自定义的异常类。         
        A.  一个try语句下面可以有多个catch语句,分别处理不同的异常。但排列顺序必须是从特殊到一般,最后一个一般都是  Exception类(模板四)。 
B.  也可以用一个catch语句处理多个异常类型,这时它的异常类型参数应该是这些异常类型的超类(模板三)。 
C.  java运行时系统从上到下分别对每个catch语句处理的异常类型进行检测,直到找到与类型匹配的catch语句为止。  匹配是指catch所处理的异常类型与所生成的异常类型完全一致或是它的超类。 
D. 如果程序所产生的异常和所有的catch处理的异常都不匹配,则这个异常将由java虚拟机捕获并处理,此时与不使用异 常处理是一样的。 
3.  finally语句  在try所限定的代码中,当抛出一个异常时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛出或不抛出异常,也无论catch语句的异常类型是否与所抛出的异常的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。该语句也是可以省略的(模板二)。 
4.  异常语句嵌套  当在处理异常时很有可能再次抛出异常,这种现象是非常常见的。常见形式为模板五。 
  
常见的异常类 
       大家也许在编程的过程中,会意识到这里出错,但不知道会抛出什么异常,也是一件头疼的事,现将这部分总结如下: 
算术异常类:ArithmeticExecption 
空指针异常类:NullPointerException 
类型强制转换异常:ClassCastException 
数组负下标异常:NegativeArrayException 
数组下标越界异常:ArrayIndexOutOfBoundsException 
违背安全原则异常:SecturityException 
文件已结束异常:EOFException 
文件未找到异常:FileNotFoundException 
字符串转换为数字异常:NumberFormatException 
操作数据库异常:SQLException 
输入输出异常:IOException 
方法未找到异常:NoSuchMethodException 
这是最常见的一些异常,大家可以在日后的使用中总结,但最详细的恐怕还是JDK的文档了。还是看JDK的文档吧:); 
  
  
Exception 异常类的方法 
Public class Exception extends Throwable 
构造方法:public Exception() 
                      public Exception(String s) 
实例方法:public String getMessage() 
                      public void printStackTrace() 
  
throw 与 throws的区别与联系 
区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常; 
throw语法:throw <异常对象> 
在方法声明中,添加throws子句表示该方法将抛出异常。 
throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>] 
其中:异常类可以声明多个,用逗号分割。 
区别二:throws可以单独使用,但throw不能; 
区别三:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。 
  
自定义异常类 
    跟声明一个类一样,但必须是继承于Exception类。可以用throw 和throws抛出这个自定义的类。 
  
  
  
  
  
  
  
  
  
  
   
 
  |