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

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

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


异常处理

什么时候使用异常

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, "用户名或者密码错误");
    } 
  }
}
相关文章
|
IDE Java 编译器
浅析@SneakyThrows
在日常的开发中,相信你一定使用过Lombok,它是一款开源的可用于Java平台的代码生成库。我们在定义JavaBean的时候,会使用IDE自动生成构造方法、getter、setter、equals、hashCode、toString等方法,一旦类的属性有修改就要重新生成,通过使用Lambok的简单注解来精简代码就能达到消除冗长代码的目的。
975 0
浅析@SneakyThrows
|
11月前
|
前端开发 JavaScript 开发者
前端 CSS 优化:提升页面美学与性能
前端CSS优化旨在提升页面美学与性能。通过简化选择器(如避免复杂后代选择器、减少通用选择器使用)、合并样式表、合理组织媒体查询,可减少浏览器计算成本和HTTP请求。利用硬件加速和优化动画帧率,确保动画流畅。定期清理冗余代码并使用缩写属性,进一步精简代码。这些策略不仅加快页面加载和渲染速度,还提升了视觉效果,为用户带来更优质的浏览体验。
|
12月前
|
存储 供应链 搜索推荐
2024年CRM系统灵活性与可拓展性盘点
在数字化商业浪潮中,CRM系统成为企业提升客户关系管理和市场竞争力的关键工具。本文深入剖析纷享销客、Salesforce、Zoho、销售易和简道云五家CRM供应商的灵活性与可扩展性。纷享销客凭借先进的PaaS平台、丰富的接口对接、与主流OA深度集成及良好的市场口碑脱颖而出,适用于各规模企业的多样化应用场景,助力企业在激烈的市场竞争中赢得先机,实现可持续发展。
|
9月前
|
存储 Linux 调度
【Linux】进程概念和进程状态
本文详细介绍了Linux系统中进程的核心概念与管理机制。从进程的定义出发,阐述了其作为操作系统资源管理的基本单位的重要性,并深入解析了task_struct结构体的内容及其在进程管理中的作用。同时,文章讲解了进程的基本操作(如获取PID、查看进程信息等)、父进程与子进程的关系(重点分析fork函数)、以及进程的三种主要状态(运行、阻塞、挂起)。此外,还探讨了Linux特有的进程状态表示和孤儿进程的处理方式。通过学习这些内容,读者可以更好地理解Linux进程的运行原理并优化系统性能。
357 4
|
存储 运维 安全
Linux命令stat:深入了解文件与文件系统状态
`stat`命令在Linux中用于显示文件和文件系统的详细状态,包括权限、大小、时间戳等。它通过读取inode获取信息,特点是显示全面、易用且支持多种参数,如`-c`自定义格式,`-f`查看文件系统状态,`-L`处理符号链接。例如,`stat example.txt`显示文件详情,`stat -c "%n 的大小是 %s 字节" example.txt`输出文件大小。理解`stat`有助于系统管理和故障排查。
|
NoSQL Java MongoDB
MongoDB $type 操作符
10月更文挑战第16天
162 2
|
缓存 API Android开发
Android经典实战之Kotlin Flow中的3个数据相关的操作符:debounce、buffer和conflate
本文介绍了Kotlin中`Flow`的`debounce`、`buffer`及`conflate`三个操作符。`debounce`过滤快速连续数据,仅保留指定时间内的最后一个;`buffer`引入缓存减轻背压;`conflate`仅保留最新数据。通过示例展示了如何在搜索输入和数据流处理中应用这些操作符以提高程序效率和用户体验。
243 6
|
机器学习/深度学习 算法 数据挖掘
深度之眼(二十七)——神经网络基础知识(二)
深度之眼(二十七)——神经网络基础知识(二)
438 3
|
SQL 大数据
常见大数据面试SQL-每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题: 问题1:每年每门学科排名第一的学生 问题2:每年总成绩都有所提升的学生
springboot2.4.5使用pagehelper分页插件
springboot2.4.5使用pagehelper分页插件
411 0