A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴祺 中级黑马   /  2015-3-31 14:38  /  889 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

异常处理
1.什么是异常
    异常:就是不正常,是指程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装,这样就方便于操作问题以及处理问题。
    出现的问题有很多种,比如角标越界,空指针,文件读取失败等都是。对这些问题进行分类抽取其共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取,形成了异常体系。

2.java的异常体系java.lang.Throwable
    Error
        通常指JVM出现重大问题如:运行的类不存在或者内存溢出等。不需要编写针对代码对其处理,程序无法处理.
    Exception
        在运行时运行出现的一些情况,可以通过try,catch,finally处理。

3.异常的分类
    Checked异常:编译时被检查异常。在程序中必须使用try...catch处理。
    Runtime异常:编译时不被检测的异常。可以不使用try...catch处理,但一旦出现异常就将由JVM处理。
    RuntimeException(运行时异常)是指因设计或实现方式不当而导致的问题。说白了,就是程序员造成的,程序员小心谨慎是完全可以避免的异常。比如,事先判断对象是否为null就可以避免NullPointerException异常,事先检查除数不为0就可以避免ArithmeticException异常。
    特点:这种异常Java编译器不会检查它,也就说程序中出现这类异常的时候,即使不处理也没有问题,但是一旦出现异常,程序将异常终止,若采用异常处理,则会被相应的程序执行处理。 
    Checked异常 :除了RuntimeException以及子类,其他的Exception及其子类都是受检查异常,我们也可以称为非RuntimeException异常。
    特点:Java编译器会检查它,也就说程序中一旦出现这类异常,要么是没有try-catch语句捕获,或throws语句没有声明抛出它,编译就不会通过,也就说这种异常,程序要求必须处理。

4.异常处理的两种方式
    捕获异常:try catch 直接处理可能出现的异常。
    声明异常:throws 声明告诉调用者可能的异常,暴露问题,调用者自己处理。

5.异常处理的格式
try{
//可能出异常的代码
} catch(异常类  对象){
//处理该异常类型的语句
}
[finally] {
//一定会执行的代码
//catch块使用System.exit(1);除外
}
注:一般把容易出现异常的代码放在try里面,当try语句块出现异常,程序会自动跳到catch语句块去找匹配的异常类型,并执行异常处理语句,finally语句块是异常的统一出口。

6.声明异常
     在可能出现异常的方法上声明抛出可能出现异常的类型。
    注意:1.声明的时候尽可能声明具体的异常,方便更好的处理;
             2.方法一旦使用throws声明抛出方法内可能出现的异常类型, 该方法就可以不再过问该异常了;
             3.一个方法调用另一个使用throws声明抛出的方法,自己要么try...catch , 要么也throws。
      格式:
public 返回值类型  方法名(参数列表...) 
      throws 异常类A,异常类B... {
 
}

7.throw
    自行抛出一个异常对象,抛出异常类的对象。若throw抛出的是Runtime异常,程序可以显示使用try...catch来捕获并处理,也可以不管,直接交给方法调用者处理;若throw抛出Checked异常,要么放在try里自己处理,要么放在一个throws声明的方法里面,交给调用者处理。
Eg:
    public static void main(String[] args) {
try {
      fn1(1);
} catch (Exception e) { e.printStackTrace(); }
fn2(2);
}
public static void fn1(int a) throws Exception{
if(a >0) { throw new Exception("fn1 -- a值不合法"); }
}
public static void fn2(int a) {
if(a >0) { throw new RuntimeException("a值不合法"); }
}
    throws & throw 
        throws用于在方法上声明该方法不需要处理的异常类型。
        throw用于抛出具体异常类的对象。
    throws与throw的区别:
        1.thorws用在方法上,后面跟异常类名,可以是多个异常类;
        2.throw用在方法内,后面跟异常对象,只能是一个。

8.finally
    finally是异常的统一出口,即不管try块程序是否异常,也不管哪个catch执行,finally块总会执行。
    try语句块或会执行的catch语句块使用了JVM系统退出语句例外;/System.exit(1);
    try块必须和 catch块或和finally同在,不能单独存在,二者必须出现一个。
    注:不要在finally中使用return 或throw语句,否则将会导致try、catch中的return或throw失效。
Eg:
package reviewDemo; 
public class Demo19 {
public static void main(String[] args) {
try{
System.out.println(17/0);
}catch(Exception e){
//e.printStackTrace();
System.out.println("Error!");
}finally{
System.out.println("finally!");
}
}
}

9.throw和catch同时使用
    当异常出现在当前方法中,程序只对异常进行部分处理,还有一些处理需要在方法的调用者中才能处理完成,此时还应该再次抛出异常,这样就可以让方法的调用者也能捕获到异常。
    Eg:
public static void buy(String price) throws Exception {
try {
if(price != null)
Double.parseDouble(price);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("价格不能只能是数字组成");
}
}
public static void main(String[] args)  {
try {
buy(null);
} catch (Exception e) {
System.out.println(e.getMessage());
}
 
}

10.多异常处理
    当可能出现多个异常时就要做多异常处理。方法声明几个异常就对应有几个catch块,若多个catch块中的异常出现继承关系,父类异常catch块放在最后。在catch语句块使用Exception类作为异常类型时,所有子类实例都可以使用父类接收(向上转型),即所有的异常对象都可以使用Exception接收。
    注:java处理异常时小范围异常必须放在大范围异常之前
    例:将多个异常写到同一个代码块中
try {
Integer a = Integer.parseInt("1");
Integer b = Integer.parseInt("0"); 
Integer c = a / b; 
System.out.println(c); 
} catch (NumberFormatException 
| ArithmeticException  e ) {
 e.printStackTrace();
}

评分

参与人数 1黑马币 +20 收起 理由
zhqw_heima + 20 赞一个!

查看全部评分

11 个回复

倒序浏览
总结的很好,感谢分享~
回复 使用道具 举报
感谢分享
回复 使用道具 举报
学习了。。。。
回复 使用道具 举报
顶一个,佩服
回复 使用道具 举报
感谢楼主分享 赞!!!
回复 使用道具 举报
总结得不错,感谢分享!!
回复 使用道具 举报
wu1123 中级黑马 2015-3-31 22:56:44
8#
来看看学习学习!!
回复 使用道具 举报
嘿嘿,总结的不错哦 ,赞赞赞
回复 使用道具 举报
Lois 中级黑马 2015-3-31 23:08:32
10#
厉害                                                
回复 使用道具 举报
坚持总结,很有用的
回复 使用道具 举报
恩,总结的不错的,看来我也可以多多学习多多总结!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马