Java基础——异常

一、引言

在Java编程中,异常处理是一项非常重要的技术。当程序运行过程中发生错误或异常情况时,如果没有适当的处理机制,可能会导致程序崩溃或产生不可预测的结果。异常处理能够帮助我们捕获并处理这些异常情况,使程序具备更好的健壮性和可靠性。通过合理地使用异常处理机制,我们可以提高程序的稳定性,并及时对错误进行处理。

二、概念

程序执行过程中不正常的情况

三、分类

  1. Throwable: 总父类,表示不正常的情况
  2. Error: 错误
    • 无法解决也无法提前避免的问题
    • 通常由硬件设备或内存等问题导致
  3. Exception:异常
    • 可以解决或提前避免的问题
    • 通常由代码导致
    • 分类:
      • RuntimeException:运行时异常,也称为未检查异常、未检异常等
        • 编译不报错,运行报错
        • 可以处理也可以不处理
        • java.lang.ArrayIndexOutOfBoundsException:数组下标越界
        • java.lang.StringIndexOutOfBoundsException:字符串下标越界异常
        • java.lang.IndexOutOfBoundsException:下标越界异常
        • java.lang.NullPointerException:空指针异常
        • java.lang.ClassCastException:类型转换异常
        • java.lang.NumberFormatException:数据类型转换异常
        • java.lang.Arithm eticException:数学运算异常
        • 都来自于java.lang包
      • 非RuntimeException: 非运行时异常,也称为已检查异常、已检异常等
        • 编译就会报错
        • 必须处理
        • 只要不是运行时异常,就一定是非运行时异常

四、异常的产生

  1. 自动产生: 当运行到有问题的代码时会自动产生异常,程序终止

  2. 手动产生:

       throw 异常对象;
    
    • 位置:方法内部
    • 作用:当程序执行到该语句,则会抛出一个异常对象,使程序强制终止
    • 使用: 同一直属范围内,下方不可存在其他有效语句
      • 无法执行

程序终止执行:

  1. 代码正常运行结束
  2. 执行到异常
  3. 执行到return;

五、异常的处理

  1. 上抛异常: 消极处理(渣男处理方式,将责任暂时抛出,抛给调用者,不根治问题)

       访问修饰符 返回值类型 方法名(形参列表)throws 异常类名1,异常类型2,..{
           
       }
    
    • 作用: 将当前方法的内部异常向上抛至调用者,当前方法无法处理该异常. 此时异常并不会被根治,如果异常最终上抛至虚拟机,则仍然会导致程序终止
    • 使用:
      1. 上抛父类异常也可以处理内部的子类异常
      2. 调用者需要处理解决的异常类型由throws上抛的类型决定

    throw和throws的区别:

    1. 位置:throw写在方法内部,throws写在方法声明处
    2. 作用:throw是抛出制造异常,throws是上抛解决异常
  2. 捕捉并解决异常:积极处理

       try{
           //有可能出现异常的代码
       }catch(有可能匹配的异常类名 引用名){
          // 对应的处理方案
       }
    
    • 特点:可以根治异常问题,如果异常正常匹配成功,则程序会继续向下执行
    • 使用:
      1. 当try中内容出现异常时,会立即开始匹配catch块,如果catch块匹配成功则程序继续执行,如果失败,则异常仍会出发程序仍然终止
      2. 可以存在多个catch块,自上而下的进行匹配
      3. 一个try-catch结构至多执行一个catch块
      4. 父类异常类型可以兼容匹配子类异常
      5. 父类异常需要写在子类异常之下
      6. 为了保证匹配一定成功,通常会在catch最下方匹配一个Exception
      7. 如果发生的是非运行时异常,则catch块无法捕捉与其无关的非运行时异常,编译报错
    • 异常信息处理:
      1. String getMessage():获取异常的详细信息
      2. void printStackTrace():打印输出异常的追栈(追踪)信息(异常类型+异常的详细信息+异常的触发位置)
  3. finally块

    • 特点:无论如何都会执行,通常用来关闭资源

    • 语法:

      try{
          
      }catch(){
          
      }finally{
          
      }
      
    • 使用;

      1. 必须与try结合使用,无法与catch单独结合
      2. 当try-catch-finally中出现return语句冲突时,优先执行finally

六、自定义异常

  1. 运行时异常:继承RuntimeException

    • 需要提供有参构造给最大父类Throwable中的详细信息属性赋值
    package com.by.exception;
    
    /**
     * 自定义运行时异常类
     */
    public class MyRuntimeException extends RuntimeException{
        public MyRuntimeException(){
    
        }
    
        public MyRuntimeException(String message) {
            super(message);
        }
    }
    
  2. 非运行时异常:继承Exception

    • 构造要求与运行时异常一致
    package com.by.exception;
    
    /**
     * 自定义非运行时异常
     */
    public class MyException extends Exception{
        public MyException(){}
    
        public MyException(String message) {
            super(message);
        }
    }
    

七、结语

异常处理是Java编程中必不可少的一部分,它不仅能够帮助我们排查和修复程序中的错误,还能提升程序的可读性和可维护性。在实际的项目开发中,我们应该养成良好的异常处理习惯,及时捕获和处理异常,避免程序因为异常而崩溃或产生意外结果。同时,我们也要注意异常处理的粒度,避免过度捕获异常,影响程序性能。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值