有关异常的处理、捕获、抛出、自定义

简介: 有关异常的处理、捕获、抛出、自定义

有关异常的处理、捕获、抛出、自定义


异常处理

什么时候使用异常

Throwable

Error 错误 无法专门处理

Exception 异常

受检异常 编译的时候,必须处理的异常,可以使用try-catch捕获异常,也可以通过throws在方法中声明抛出异常

非受检异常(运行时异常)

捕获异常 更重要

try-catch-finally

catch可以有多个,catch和finally至少存在一个

如果代码出现异常,异常代码后的代码不再执行,直接跳转到对应的catch代码块进行操作

不管代码是否有异常,finally中的逻辑都会执行,哪怕使用了return (使用System.exit() 退出程序,finally中代码不会执行)

package com.qfedu.exception;
public class App2 {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    int a = 10;
    int b = 0;
    // 针对可能出异常的代码使用try包起来
    // 如果出异常,使用catch捕获异常
    // 出现异常后,出现异常的代码,后续的代码不会执行,跳转到catch语句块,执行其中的代码
    // 如果try括住的代码正常执行,不会进行catch代码块
    // 可以写多个catch 捕获不同的异常,如果代码发生异常,和catch后的异常进行比对,
    //    符合哪个具体的异常就进入哪个catch代码块中
    // 针对需要具体处理的异常,通过在catch后这是具体的异常可以捕获,但是我们不可能预见所以可能的异常,
    //    这时,就可以使用catch捕获Exception类型的异常,防止遗漏
    //    注意:父类的Exception异常一定要放在所有catch代码块的最后
    // 实际开发中,一般报异常了,会将异常信息记录到日志系统
    try {
      int c = a / b;
      System.out.println(c);
      // String str = null;
      String str = "hello";
      System.out.println(str.length());
      // ClassCastException
      Object o = "hello";
      Integer i = (Integer)o;
    } catch(ArithmeticException e) {
      System.out.println("除0错误");
    } catch(NullPointerException e) {
      System.out.println("空指针异常");
    } catch(Exception e) {
      // 打印异常的栈跟踪信息
      e.printStackTrace();
      System.out.println("未知异常");
    }
  }
}
package com.qfedu.exception;
public class App4 {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    // 不管代码是否异常,最终都会执行finally代码块中逻辑
    // 在try或catch的代码块中,即使使用了return,finally代码块中的逻辑也会执行
    // 使用System.exit()情况下,退出整个程序,finally中逻辑不会执行
    try {
      int a = 10 / 3;
      System.out.println(a);
      // return;
      // 退出程序
      // System.exit(0);
    } catch (Exception e) {
      System.out.println(e.getMessage());
      return;
    } finally {
      System.out.println("finally");
    }
    // 了解
    // 语法上catch可以不写,如果不写,无法捕获异常,异常就会自动往上层抛,本例中,抛给jvm进行处理
    try {
      int b = 10 / 0;
    } finally {
      System.out.println("finally2");
    }
  }
}

抛出异常

声明方法时,通过throws指定抛出的异常

在方法中,通过throw抛出异常

package com.qfedu.throwes;
public class App {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    // main方法中调用test1() 方法,
    // test1()没有捕获异常并处理,当test1()发生异常时,将异常对象往上抛
    // 本例中,test1()中发生的异常抛给main()方法
    // main()中也没有捕获异常进行处理,main()方法将异常继续往上抛,最终抛给jvm,由jvm处理异常
    // test1();
    try {
      // test2();
      test3();
    } catch(ArithmeticException e) {
      System.out.println(e.getMessage());
    } catch(Exception e) {
      System.out.println("未知异常");
    }
  }
  public static void test1() {
    int a = 10 / 0;
    System.out.println(a);
  }
  // 在方法中,声明需要抛出的异常,针对受检异常相对多些
  public static void test2 () throws ArithmeticException {
//    int a = 10 / 0;
//    System.out.println(a);
    String str = null;
    System.out.println(str.length());
  }
  // 在方法中通过throw 抛出异常 ,针对自定义异常,针对需要改变运行流程的情况,使用相对多些
  public static void test3() {
    try {
      int a = 10 / 0;
    } catch(ArithmeticException e) {
      throw e;
    }
  }
}

自定义异常

继承Exception或者RuntimeException

一般结合throw一起使用,通过自定义异常,可以实现终止业务逻辑的功能

package com.qfedu.customerex;
// 如果继承Exception类,在其他地方创建并抛出异常类对象,默认会报错(当成受检异常进行处理)
// 个人建议,继承RuntimeException
public class LoginException extends RuntimeException{ 
  // 针对异常信息的编码值
  private int code;
  // 异常信息
  private String msg;
  public int getCode() {
    return code;
  }
  public void setCode(int code) {
    this.code = code;
  }
  public String getMsg() {
    return msg;
  }
  public void setMsg(String msg) {
    this.msg = msg;
  }
  public LoginException(int code, String msg) {
    super(msg);
    this.code = code;
    this.msg = msg;
  }
}
package com.qfedu.customerex;
public class App2 {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
      login(null, "1235");
      System.out.println("合法用户");
    } catch (LoginException e) {
//      System.out.println(e.getMsg());
      System.out.println(e.getMessage());
    }
  }
  // 借助抛异常的方式,终止程序的后续逻辑
  public static void login(String name, String password) {
    if(name == null || name.isEmpty()) {
      // 创建了一个自定义异常的对象,然后通过throw抛出
      throw new LoginException(101, "请输入用户名");
    }
    if(password == null || password.isEmpty()) {
      throw new LoginException(102, "请输入密码");
    }
    if(!(name.equals("admin") && password.equals("123"))) {
      throw new LoginException(103, "用户名或者密码错误");
    } 
  }
}
相关文章
|
11天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
|
11天前
|
人工智能
千问办公官网入口:阿里AI办公QwenWork产品页和免费网页端链接
千问办公官网含两大入口:一是网页端(qwenwork.cn),即开即用,支持浏览器直接访问;二是阿里云产品页 https://t.aliyun.com/U/JNKJuO 提供免费/付费版详情、功能介绍及使用指南。
|
17天前
|
网络协议 Linux iOS开发
【2026实测】Wireshark下载+安装+汉化+使用教程(图文版,巨详细)
Wireshark 是一款免费开源的网络协议分析工具,可实时捕获、解析并可视化数据包,助你诊断网络故障、分析通信协议(如HTTP、DNS、TCP等)。支持Windows/macOS/Linux,含中文界面,新手入门便捷。(239字)
|
10天前
|
IDE 开发工具
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
Qoder国际版上线全新内置大模型Sonus(/ˈsoʊnəs/),全球领先,专精超长任务执行与电脑操作(Computer Use)。配合Qoder桌面端0.2.3版本,可自主完成编程、金融建模、科研及表格制作等复杂工作。现全面支持Qoder全系产品,效率提升3.2倍。
1157 8
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
|
12天前
|
人工智能 API 内存技术
刚刚 DeepSeek V4.1 Flash 开启内测,1 分钟教你用上!
刚刚 DeepSeek 内测群发布了 DeepSeek V4.1 Flash 中间版本内测的消息,这次的模型采用了新的结构,原生支持多模态、能力更强、速度更快、且成本更低。
1961 15
|
12天前
|
缓存 人工智能 自然语言处理
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
本文是阿里云百炼平台Qwen3.8-Flash大模型的选型接入指南,作为兼顾性能与响应速度的高性价比多模态模型,它支持百万级上下文窗口、全场景多模态输入与完整智能体能力矩阵,适配编程辅助、智能体协作等核心场景。文中同步梳理了最新下调的阶梯定价、夜间4折等优惠活动,搭配OpenAI兼容流式调用示例,帮助开发者低成本快速落地高并发AI应用。
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
|
16天前
|
人工智能 运维 BI
阿里云千问办公QwenWork深度解析:基于Qwen3.8,六大核心能力重构企业全自动化工作流与计费选型指南
传统AI办公工具大多停留在对话问答、文档摘要、简单文案生成层面,只能完成单点碎片化任务,无法自主拆解复杂业务流程,很难串联多工具、多文档、外部业务系统完成端到端完整工作交付。很多企业在落地AI办公的时候,需要组合多款不同工具,来回切换界面,手动复制粘贴中间结果,智能化改造落地门槛居高不下。千问办公QwenWork是整合多款智能体产品能力打造的一体化企业办公智能体平台,底层基座依托Qwen3.8大模型,打通桌面端Agent、云端Agent、企业协同Agent三种运行形态,不再局限简单问答,接收业务目标之后自主拆解任务步骤,调用各类工具,处理文档、表格、浏览器自动化、数据查询,直接输出可交付的办公
1679 4
|
18天前
|
缓存 数据可视化 开发工具
DeepSeek Harness 怎么更新?dsh 更新完整指南:更新本体(npx、npm、源码)与更新插件两种方式
DeepSeek Harness 的更新分两层:本体更新(npx 自动最新、npm update -g、源码 git pull)与插件更新(插件市场点更新、命令行覆盖安装)。本文按「准备 → 更新本体 → 更新插件 → 更新后检查」四步走,覆盖新手常见疑问。
1977 1
DeepSeek Harness 怎么更新?dsh 更新完整指南:更新本体(npx、npm、源码)与更新插件两种方式
|
13天前
|
SQL 人工智能 前端开发
QoderWake 1.0 正式发布:从桌面里的 Agent,到工作现场的数字员工
QoderWake v1.0正式发布:企业级数字员工团队平台。支持“一句话建岗”,预置10类特训岗位;Waker常驻钉钉/飞书群,@即响应、自动协作、跨任务记忆;具备定时/事件/API多触发方式与统一任务看板;已沉淀27.6万条记忆、12.3万项技能,助力组织实现人机协同增效。
853 2
|
11天前
|
缓存 测试技术 API
DeepSeek V4.1 Flash 内测接入:改个模型名即可调用(附代码)
DeepSeek V4.1 Flash 内测不用申请,base_url 不变、改个模型名就能调,9/10 到期。本文讲清接入、计费限流与多模态注意点。
861 0
DeepSeek V4.1 Flash 内测接入:改个模型名即可调用(附代码)

热门文章

最新文章