异常详解,一文搞懂!

简介: 异常详解,一文搞懂!

异常

定义

程序编译或者运行的不正常情况,是一种处理程序编译或运行时错误的机制

异常处理机制的处理原理

当程序运行过程中出现异常的时候,java虚拟机会创建一个异常对象(throw 主动抛出),将其抛到调用栈中,使其沿着调用栈向上,直到在调用其方法的其他方法中的方法体内找到一个与之匹配的catch块。如果找到了匹配的catch块,就会执行该块中的代码,并继续执行程序。如果没有找到匹配的catch块,异常就会继续向上抛出(throw),直到被JVM的默认异常处理器(输出异常信息)处理为止。

常见异常
java.util.InputMismatchException 输入类型不匹配
java.lang.ArrayIndexOutOfBoundsException 数组越界异常
java.NullPointerException 空指针异常 调用空对象的方法
java.classCastException 类型转化异常
NumberFormatException 数据类型转换异常
ArithmeticException 算数异常
try {
   
    // 获取用户提交的数据
    String input = request.getParameter("input");

    // 对输入数据进行验证
    if (input == null || input.equals("")) {
   
      throw new Exception("输入不能为空");
    }
    if (!input.matches("\\d+")) {
   
      throw new Exception("输入必须为数字");
    }
    int num = Integer.parseInt(input);
    if (num < 0 || num > 100) {
   
      throw new Exception("输入必须在0-100之间");
    }

    // 验证通过,执行相应的操作
    // ...
  } catch (Exception e) {
   
    // 验证失败,捕获异常并进行相应的处理
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<script>alert('" + e.getMessage() + "');</script>");
    // ...
  }

在前端页面进行验证处理的时候,获取用户输入的数据,并对输入数据进行验证,抛出带有不同异常信息的异常,进行catch之后,可以生成一个提示框,并在提示框中添加相应的异常信息。

异常分类

编译型异常:没有继承runtimeException,编译时需要强制处理。util lang

运行型异常:继承了runtimeException,编译时不需要强制处理。test io net sql

runtimeException及其子类通常表示程序内部错误或逻辑错误,属于非检查异常,表明这类异常无需抛出或者强制捕获(不是很严重)

自定义异常

作用:构造出特定情况下需要的异常

public class 异常类名 extends Exception{
   
    public 异常类名(String msg){
   
    super(msg);
  }
}
  public void doSomething(){
   
        try{
   
      if(...){
    // 说明此类异常符合该特定条件
        throw new 异常类名("...");
      }
    }catch(...){
   
        //输出异常信息
    }
  }
}
运行时异常的处理

1.异常机制:对运行时异常 不可取,常用程序逻辑的方式,一般要给一个非法值,供调用者识别,且一定要详细编辑文档注释(e g: return -1

  1. throw new 编译异常(...):必须声明throws 编译异常(抛出之后 必然有某处需要处理异常)
    throw new 运行时异常(...):无需声明 可能在try中抛出多个运行时异常,在catch中考虑差异化处理(catch分支)或者统一处理,以统一处理为例,则可以调用某一方法对异常对象实现日志记录,发出服务器响应等等操作。

  2. 有throw就必有try...catch,请务必注意抛出的运行时异常(无声明,易忽略)

  3. 用异常机制处理:throw new 异常类型(字符串拼接(IO 2))

  4. try-catch的两种常见模板

    1.多分支catch:便于进行差异化处理

     try{
         
        异常代码:不确定是异常的代码不要放进去,逐行检索异常代码效率比较低
        }catch(自己拋的异常 对象){
         
        对象.printStackTrace();(开发时用)
        }catch(别人(jdk/开发团队队友)抛出的异常 对象){
         
        对象.printStackTrace();
        }catch(Exception e){
          (解决隐性异常,无论是什么异常,从多态的角度都是Exception)
        e.printStackTrace();
        }
    

    2.使用异常多态:主要只是为了查看异常信息的内容

    try{
         
      ...
    }catch(Exception e){
         
      e.printStackTrace();
    }
    

6.finally的作用

常用于关闭资源、文件,数据库连接,日志记录,发送响应通知,执行清理操作等功能。

7.子类不能抛出比父类类型更大的异常(子类限制始终比父类更加严格)

IO 1
/**
 *
 * @param a 被除数(>=0)
 * @param b 除数(>0)
 * @return 当b不等于0时,返回a/b,当b等于0的时候,返回-1(返回-1的原因:a/b的结果一定是>=0的 出现负值就说明有异常)
 */
 static float divide(int a,int b) throws Exception{
   
        if(b == 0){
   
//            运行时异常return -1是比较安全的
//            return -1;
//            throw new ArithmeticException("除零异常");
            throw new Exception("除零异常");//抛出异常的源头
        }
        return a*1.0f/b;
    }
IO 2:
private static int []array = {
   1,2,3,4};
static int get(int index){
   
    if(index < 0 || index >= array.length){
   
        throw new IndexOutOfBoundsException("下标越界异常(0~"+(array.length-1)+"):"+index);
    }
    else
        return array[index];
}
目录
相关文章
|
6月前
|
编解码
均匀分布直线阵的常规波束形成方位谱和波束图
均匀分布直线阵的常规波束形成方位谱和波束图
|
存储 缓存 openCL
MNN Session 之 Vulkan 算子(八)
MNN Session 之 Vulkan 算子(八)
262 2
|
机器学习/深度学习
深入理解SVM中的核函数及其应用
深入理解SVM中的核函数及其应用
701 91
|
人工智能 监控 算法
3D-Speaker:阿里通义开源的多模态说话人识别项目,支持说话人识别、语种识别、多模态识别、说话人重叠检测和日志记录
3D-Speaker是阿里巴巴通义实验室推出的多模态说话人识别开源项目,结合声学、语义和视觉信息,提供高精度的说话人识别和语种识别功能。项目包含工业级模型、训练和推理代码,以及大规模多设备、多距离、多方言的数据集,适用于多种应用场景。
3499 18
3D-Speaker:阿里通义开源的多模态说话人识别项目,支持说话人识别、语种识别、多模态识别、说话人重叠检测和日志记录
|
Ubuntu 安全 Linux
基于Ubuntu24.04原内核6.8.0升级到6.9.0
通过上述步骤,我们在Ubuntu 24.04系统上成功地将内核从6.8.0升级到了6.9.0。升级内核有助于提高系统的安全性和性能,但也可能带来兼容性问题。因此,在升级前备份重要数据,并确保新内核支持所需的所有硬件和软件。通过合理的验证和测试,可以确保系统在新内核上稳定运行。
1627 6
|
网络协议 安全 算法
OSPFv3新特性介绍
OSPFv3新特性介绍
308 4
|
Java Spring
运行@Async注解的方法的线程池
自定义@Async注解线程池
565 3
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
546 1
|
小程序 前端开发
网络祭祀人物微信小程序模板源码
网络祭祀人物微信小程序模板源码
251 5
|
vr&ar
AR和VR的光学结构分别是什么?
【6月更文挑战第25天】AR和VR的光学结构分别是什么?
971 5