java 异常处理

一、基本概念
(1)异常:程序运行期间出现的不正常现象称为异常
(2)异常由来:问题来源于现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成类。比如:在引用变量没有赋值之前进行使用,会出现NullPointerException,在除法运行中除数为0则出现ArithmeticException,在数组下标越界访问数组元素时出现ArrayIndexOutOfBoundsException等等。


对问题的划分:
(1)严重问题:java通过Error类进行描述,对于Error一般不编写针对性的代码对其进行处理。

(2)非严重问题:java通过Exception类进行描述,对于Exception可以编写针对性的代码对其进行处理。


Java将一般问题封装成了类,并由虚拟机进行处理
无论Error 还是Exception都具有一些共性内容,比如:不正常情况的信息,引发原因等。向上抽取形成父类Throwable。
Throwable
    |----Error
    |----Exception
异常的处理
    java提供了特有的语句进行处理:try…catch…finally捕获异常
    try{ 
    //需要被检测的代码
    }catch(异常类   变量) {
//处理异常进行的代码;
    }finally{
//一定会运行的程序代码,一般为释放资源语句
    }
示例1:
class Demo{
    int div(int a,int b){
return a/b;
    }
}
public class ExceptionDemo {
    public static void main(String[] args) {
        Demo d=new Demo();
        try{
              int x=d.div(4,0); 
              System.out.println("除法结果x=" + x);
        }catch (Exception e){
      System.out.println("除数为零!");
        }
        System.out.println("计算结束!");
    }
}
当执行d.div(4,0)语句时,调用Demo类的div方法,传递参数(4,0),然后执行a/b,因b为0,除法发生除数为零异常,java的JVM将创建异常实例对象:
                new ArithmeticException();
将该异常匿名对象传递到catch(Exception e)语句形参e,即Exception e=new ArithmeticException();,捕获异常成功而执行catch子句中的语句。
但是:
   在main方法中对div方法调用的异常捕获不是必须的,或者说程序员可能并不知道这里需要捕获异常,因为没有任务提示。
所以:
   Demo类的设计者,对于div方法中有除法a/b语句,应用知道除数为零没法正常做除法,所以在封装div方法时,应用在方法的声明上抛出异常声明,提示调用者调用该方法可能会出现异常,你必须去处理这个异常。
改进:
class Demo{
    int div(int a,int b)throws Exception{
return a/b;
    }
}
那么在main方法中调用div方法时则必须处理异常,否则会出现语法编译错误,提示用户处理异常。


二异常处理方法
1、使用try…catch…finally捕获异常并处理(自己捕获,自己处理)
   详见上述实例过程。
2、继续向外抛出异常
   在调用有异常提示语句的方法中,方法声明上继续向外抛出异常,让别人去处理这个异常(即将异常向外传递)。
  如上例,改写main方法:
   public static void main(String[] args)throws Exception {
        Demo d=new Demo();
        int x=d.div(4,0);
System.out.println("除法结果x=" + x);       
        System.out.println("计算结束!");
    }
将调用div方法可能会出现的异常传递给了main方法,则调用main方法的位置同样需要去处理这个异常,当然由于是main方法,如何处理则由JVM去处理。


三、异常处理总结:
1、定义一个方法时,若这个方法在运行时可能出现异常,正确的做法是在方法中抛出异常,让调用者去处理异常
2、在方法中抛出异常的方式:
(1)若异常现象为java内部定义的异常,则只要在方法声明后使用"throws 异常类型"直接抛出即可。
(2)若异常现象为程序员自定义的异常类型,则一般需要在方法体内根据条件判断,使用"throw new 自定义异常类型()"生成自定义异常实例并抛出,同时在方法声明后使用"throws 自定义异常类型"进行异常类型抛出。
3、java异常(Exception)有运行时异常(RuntimeException)和编译时异常(CheckedException),对于编译时异常,需要用户在编译前就必须处理。对于运行时异常及其子类,java编译器不会检查程序是否对RuntimeException进行了处理,在程序中也就可以不必捕获该异常,在方法中也不必在方法体声明后抛出该异常类。RuntimeException表示程序中出现了编程错误,应该去找出错误而修改程序,而  不是捕获异常。
4、处理异常方式:
(1)自己捕获,自己处理
(2)继续向外抛出异常


四、自定义异常过程
   异常一般关注的是异常的类型和异常信息,所以自定义异常类时,只要简单的封装异常信息即可,另外必须继承Exception或其子类。
   实例2:设计一个书本类,封装设置书本价格方法时,对于价格小于0的输入,需要抛出异常。
    class BookPriceException extends Exception{
          double price;
          BookPriceException(String msg,double price){
              super(msg);
              this.price=price;
          }
          double getPrice(){
              return price;
          }
    }
    class Book{         
         double price;
         //....
         void setPrice(double price)throws BookPriceException{
             if(price<0)
                 throw new BookPriceException("价格小于0",price);
             this.price=price;
         } 
   }
public class ExceptionDemo {
    public static void main(String[] args) {
        Book b=new Book();
        try{
              b.setPrice(-100);
        }catch (BookPriceException e){
      System.out.println(e.getMessage()+e.getPrice());
        }
    }
}
 
五、多异常处理
   try{//.....}
   catch(异常类型1 e1){//.....}

   catch(异常类型2 e2){//.....}

   在catch子句中父类异常位置靠后,子类异常靠前放置,因为异常检查是按照顺序捕获的






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值