异常详解,一文搞懂!

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

异常

定义

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

异常处理机制的处理原理

当程序运行过程中出现异常的时候,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];
}
目录
相关文章
|
编解码 Shell 文件存储
Rockchip saveBaseParameter程序来设置显示器参数
Rockchip saveBaseParameter程序来设置显示器参数
1574 50
|
28天前
|
Web App开发 人工智能 JavaScript
【软著】软著补正大坑:卡在 AI 原创声明,重新提交又等了 30 天
登记软著后收到补正通知,需在30日内依据《生成式人工智能服务管理暂行办法》提交声明文件及软件名称说明,文章提供了模版
257 3
|
5月前
|
SQL 人工智能 自然语言处理
数据平台主管做智能问数选型,最该先看技术路线还是实施能力?
本文为数据平台主管提供智能问数选型的系统化框架,聚焦2026年关键矛盾:技术路线决定能力上限与长期成本曲线,实施能力决定上限能否落地。从四类主流路线(预置SQL、宽表、指标平台、本体语义层)对比出发,结合实施能力三要素(语义构建、知识校准、持续运营)与场景成熟度判断,助力企业在“先进性”与“可行性”间找到平衡点。
|
6月前
|
缓存 监控 网络协议
通过IP地址查询判断网络风险,有哪些具体指标和判断方法?
本文详解IP风险评估三大核心维度:基础属性(如net_type、地理位置)、行为特征(频率、IP段聚集性)与历史信誉(risk_score、threat_tags),结合离线库毫秒查询与动态阈值策略,提供可落地的分级风控方案,有效识别代理、秒拨及云主机恶意流量。
通过IP地址查询判断网络风险,有哪些具体指标和判断方法?
|
6月前
|
存储 安全 Java
深入拆解 synchronized:从偏向锁到重量级锁的升级之旅与优化秘籍
本文深入剖析Java中synchronized的底层实现:详解偏向锁、轻量级锁到重量级锁的升级机制,结合对象头Mark Word结构、JVM锁优化(自旋、消除、粗化、逃逸分析),并附死锁排查实战,助你真正掌握并发同步原理。
347 3
|
存储 缓存 openCL
MNN Session 之 Vulkan 算子(八)
MNN Session 之 Vulkan 算子(八)
469 2
|
8月前
|
人工智能 定位技术 SEO
GEO ROI衡量的完整逻辑链:从心智到商业价值的系统化方法
本文提出GEO(生成式引擎优化)ROI衡量新范式:摒弃传统SEO的排名点击逻辑,转向“被AI引用与信任”的心智份额评估。构建“定义有效→设定基准→全链路指标→ROI计算→决策迭代”五步逻辑链,强调答案引用率、权威信源占比、高质量转化率等核心指标,实现影响力到商业价值的科学转化。
|
8月前
|
存储 弹性计算 网络安全
阿里云服务器使用指南:从入门到精通,一篇就够,新手也能轻松上手!
阿里云ECS新手指南:涵盖地域、VPC、实例规格、镜像、存储、公网IP、安全组、密钥对等核心配置;详解按量付费、包年包月及抢占式实例;新用户可享3个月免费试用;支持控制台、SDK、CLI、Terraform等多种创建方式,助你快速上手云服务器。
479 7
|
编解码
均匀分布直线阵的常规波束形成方位谱和波束图
均匀分布直线阵的常规波束形成方位谱和波束图
|
人工智能 移动开发 物联网
ModelScope魔搭25年6月发布月报
从2022年11月的青涩发布,魔搭现今已进入第三个年头,成为中国最大最活跃的开源模型社区,与超过1600万的开发者同行。
750 6