Java基础--异常机制处理

Java异常机制

什么是异常

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。

不一定会导致程序无法继续运行,根据程序员的处理来决定是否停止运行或者提示又或者其他方式

  • 检查性异常
  • 运行时异常

有的可以避免,有的无法避免

分为几大类

  • 用户输入了非法数据
  • 要打开的文件不存在
  • 网络通信时中断
  • JVM内存溢出

但我们自己定义的异常则不属于这个范畴,比如,如果输入的年龄大于了120,我们可能会定义一个自定义异常,来抓取输入可能出现的异常,来提醒用户年龄的输入

而与异常不同的是,是错误

错误:脱离了程序员控制的问题,在代码中通常被忽略

比如,栈溢出,这个是程序员即使进行调试优化也无法遇见的bug

异常类

Exception类是所有异常类的父类

而需要抛出的问题,包括了异常和错误

所以大体层次为

而Java语言定义了很多供我们使用的异常类在java.lang标准包下

具体是何种类,以自己想要的异常处理为筛选条件,通过Java官方文档进行查看

如何进行捕获异常

try catch

具体语法看代码以及相关注释 – 以ArithmeticException为例子

ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。

 public void Cal() //throws 异常类 -- 也可以在这里写,如果没有捕获到异常,会将异常检查抛出到他的调用者身上
 {
        if(cal == '+'){
            System.out.println("运算结果为"+(a+b));
        }else if(cal == '-'){
            System.out.println("运算结果为"+(a-b));
        }else if(cal == '/'){
            //若为除法的同时,第二个运算数是0,抛出异常
            if(b == 0){ //该条件即为一个整数"除以零"时,抛出此类的一个实例
                throw new ArithmeticException();
                //在函数定义中,在判断出现异常条件中,抛出一个新构造的异常类
            }else {
                System.out.println("运算结果为" + (a / b));
            }
        }else if(cal == '*'){
            System.out.println("运算结果为"+(a*b));
        }else{
            ;
        }
    }
    
    //进行调用
    try{
            cal.Cal(); //代码块中为要被检查是否有异常的代码
        }catch(ArithmeticException e){
            System.out.println("在使用除法运算时,第二份运算数不可为0");
            //抓取到异常后应该进行的相应操作--由程序员自己设计
        }

也可以进行多重捕获

 try{
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }

当然,如果前面的catch已经抓取到了异常,相应代码块中的代码就会被执行,而后面的catch就会自动跳过;否则,则会遍历所有的catch

也可以进行是否抓取到都进行一些操作 – finally

 try{
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }finally{
    // 程序代码
 }

[!IMPORTANT]

  • catch不能独立于try存在
  • finally可加可不加
  • try代码后必须要有catch后者finally其中的一个
  • trycatchfinally之间不能有任何代码

声明自定义异常并进行使用

要求

  • 所有异常都必须是 Throwable 的子类。
  • 如果希望写一个检查性异常类,则需要继承 Exception 类。
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

例子

 public static void setCal(char cal)throws InvalidOperatorException {
        //若不属于规定的运算符,抛出异常
        if(cal != '+' && cal != '-' && cal != '*' && cal != '/'){
            throw new InvalidOperatorException(cal);
        }else{
            this.cal = cal;
        }
    }
    
    //自定义异常
class InvalidOperatorException extends Exception{
    String msg;
    public InvalidOperatorException(char cal) {
        this.msg = "不可以使用这个运算符"+cal+"进行运算";
    }

    @Override
    public String toString() {
        return "MyExeption{" +
                "msg='" + msg + '\'' +
                '}';
    }
}
 //检查是否有异常,有就抓取,并输出异常信息
        try{
            cal.setCal(cal1);
        }catch(InvalidOperatorException e){
            System.out.println(e.toString());
        }

通用异常

  • **JVM(Java虚拟机) 异常:**由 JVM 抛出的异常或错误。例如:NullPointerException类ArrayIndexOutOfBoundsException类ClassCastException类
  • **程序级异常:**由程序或者API程序抛出的异常。例如 IllegalArgumentException类IllegalStateException类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值