java基础-第八章 异常处理

java基础

待补



前言

Java的异常(Exception)是Java提供的一种识别及响应错误情况的机制。当程序出现错误时,Java虚拟机(JVM)会创建一个异常对象。这个异常对象包含了错误发生的详细信息,并且JVM会把当前的控制权交给异常处理器(exception handler)。异常处理器是一段代码,用于处理异常情况。


1异常概述

异常是程序运行时遇到的各种导致程序出错的情况的统称。

2异常的抛出与捕捉

2.1抛出异常

异常抛出后,如果不处理,如果程序真遇到异常就会在异常处停止。

2.2捕捉异常

可以捕捉异常,在异常发生时采取相应处理,格式为:

try{  
  主程序  
}catch(excption1){  
    发生excption时的处理程序  
}catch(excption2){  
    发生excption2时的处理程序  
}finally{  
    在无论有没有异常,或异常有没有解决都会运行的代码  
}

finally中的代码也可能会因为前面的异常的影响导致自己的代码也出现异常而无法执行,比如前面的程序出现异常导致某个数据出错,但finally中也要用到这个数据。

3java中常见的异常类

运行时异常(RuntimeException)、检查型异常(Checked Exceptions)、错误(Error)、自定义异常

4自定义异常

可以自己新建一个类,并继承Excption类,自定义异常,如:

public class MyException extends Exception{  
  //自定义异常的构造方法  
    public MyException(String ErrorMessage){  
      //调用父类Excption的构造方法,会弹出错误信息ErrorMessage  
        super(ErrorMessage)  
    }  
}

下面演示如何捕获和使用自定义异常:

public class Tran {  
  
  //定义静态方法avg,用于检测传入的两个数的范围在不在0以下  
  //throws抛出了自定义异常,表示此方法在遇到MyException异常时交给上一层解决  
  static int avg(int num1, int num2) throws MyException {  
    if (num1 < 0 || num2 < 0) {  
      throw new MyException("不能使用负数");  
    }  
    return num1 + num2;  
  }  
  
  //下面在主方法中调用avg并模拟异常  
  public static void main(String[] args) {  
    try {  
      //调用avg方法后判断参数小于0,则创建了异常对象,并  
      //把“不能使用负数”作为错误信息填入其中  
      int result = avg(-1, -2);  
      sout(result);  
    } catch (MyException e) {  
      //把填入错误信息后的异常类对象打印,查看错误信息  
      sout(e);  
    }  
  }  
}

5在方法中抛出异常

5.1使用throws抛出异常

throws用在方法定义中抛出多个异常,异常之间用逗号分隔

5.2使用throw抛出异常

throw用在方法体中手动抛出一个异常对象,程序在执行到throw后就不会继续执行后面的语句,
下面举例-使用自定义异常配合throw来完成在调用方法时如果不符合要求就抛出异常的案例:
首先创建自定义异常(决定该异常可以干什么):

public class MyException extends Exception {  
  
  //定义变量存储错误提示信息  
  String message;  
  
  //定义构造方法  
  public MyException(String ErrorMessage) {  
    sout(ErrorMessage);  
  }  
  
  //覆写getMessage方法  
  public getMessage() {  
    return message;  
  }  
}

接下来在方法中判断是否抛出自定义异常对象(决定在什么情况下抛出异常):

public class Captor{  
  //定义quotient()方法,来计算两数之商,但除数不能为负数  
    statuc int quotient(int x,int y)throws MyExeption{  
        if(y<0){  
            throw new MyException("除数不能为负数")}  
      return x/y;  
    }  
  public static void main(String args[])(){  
      try{  
      //调用quotient方法,并且传入的y为负数  
        int result=quotient(3,-1);  
    }catch(MyException e){  
      //因为传入的y为负数,满足方法定义中抛出自定义异常的条件  
      //则会捕获到自定义异常对象,执行该段catch程序  
        sout(e);  
    }catch(Exception e){  
        sout(e);  
    }  
  }  
}

注意:catch捕获异常的顺序要格外注意,在捕获异常时会从上到下匹配每个catch中的异常,并执行第一个匹配上异常的处理程序,但因为某些异常有继承关系,所以可能会因为顺序执行了父类异常的处理程序。
比如以上例子:如果把Exception的catch语句放到MyException的catch语句上面,则会执行catch(Exception)中的处理语句,而不是catch(MyException)的处理语句

6运行时异常

非检查型异常也被称为运行时异常(Runtime Exceptions),它们不需要在方法签名中使用throws关键字来声明,编译器也不会强制要求调用者捕获或声明这些异常。

7异常使用原则

重写方法时要抛出和原方法相同的异常或者异常的子类,同时重写的新方法不能抛出原方法没抛出过的异常
总结:子类可以少抛不可多抛,可以抛同样的异常或者那个异常的子类,但不可以抛新异常

总结

简单介绍一下java中的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值