异常
2.1异常的介绍
Java中所有的异常都是类,可以去API帮助文档寻找
2.2异常体系
2.2.1Error
严重级别的问题
常见的有栈、堆内存溢出
通常是硬件问题,性能不足
2.2.2Exception
1.RuntimeException
编译阶段不报错, 运行的时候才出错.
一般为程序员编写代码时粗心大意
2.除RuntimeException以外
特点: 代码语法正确, 但是编译就是报错
作用:起到提醒作用, 告知使用者这段代码很有可能出错,需要我们对问题给出预处理方案, 将来出现问题, 直到怎么解决.
2.3异常的处理方式
2.3.1抛出异常(默认处理流程)
1.执行流程
-
虚拟机会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException
-
异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机
-
虚拟机接收到异常对象后,先在控制台直接输出异常信息数据
-
直接从当前执行的异常点停掉当前程序
-
后续代码没有机会执行了,因为程序已经停止了
2.格式
异常处理方式1 —— try…catch…
-
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
-
这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
try{// 监视可能出现异常的代码!
}catch(异常类型1 变量){
// 处理异常
}catch(异常类型2 变量){
// 处理异常
}...
//Exception可以捕获处理一切异常类型!
try{
// 可能出现异常的代码!
}catch (Exception e){
e.printStackTrace(); // 直接打印异常栈信息
}
异常处理方式2 —— throws
-
throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
-
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
//第一种
方法 throws 异常1 ,异常2 ,异常3 ..{
}
//第二种
//代表可以抛出一切异常
方法 throws Exception{
}
异常处理方式3 —— 前两者结合
-
方法直接将异通过throws抛出去给调用者。
-
调用者收到异常后直接捕获处理。
3.使用场景
两种异常处理方式的选择思路
如果是面向用户,那应该使其不可见,选择try…catch…
如果是面向开发人员,防止其提供的数据有误,应该使其可见,选择throws
4.throw和throws
-
throw后面跟的是一个异常类的对象,将异常类对象抛出
-
throws后面跟的是异常类的名字,表示声明,这个方法中可能会出现这些异常;throws后面可以写多个异常类的名字,中间用","隔开
-
若throw后面跟的是RunTimeException对象及其子类,方法后面可以不用写throws
5.抛出的异常类型细节
2.3.2捕获异常
1.格式
快捷键 Ctrl+Alt+T
try {可能会出现异常的代码
} catch(异常类型1 变量) {
处理异常的方案
} catch(异常类型2 变量) {
处理异常的方案
}
2.执行流程
public static void main(String[] args) {
try {
int[] arr = null;
System.out.println(arr[0]);
System.out.println(10 / 0);
System.out.println("看看我执行了吗?");
} catch (NullPointerException e) { // NullPointerException e = new NullPointerException();
System.out.println("捕获了空指针异常...");
} catch (ArithmeticException e) {
System.out.println("捕获了运算异常...");
}
System.out.println("后续代码...");
}
/*
异常的两种处理方式:
1. 抛出异常
2. try...catch捕获异常 √
格式:
try {
可能会出现异常的代码
} catch (异常类名 对象名) {
异常的处理方案;
}
好处: 程序不会崩溃, 后续代码可以继续执行.
执行流程:
1. 执行try {} 中的代码, 看是否有问题产生
2. 有: 由catch负责捕获异常, 执行异常处理方案, 后续代码继续执行
3. 没有: 不执行catch内部的逻辑, 代码继续执行
细节补充:
1. 如果try语句中有多个异常, 后面可以跟多个catch
2. 如果编写了多个catch, 最大的异常一定要放最后
3. JDK7版本开始catch中可以编写多个异常类名, 中间使用 | 进行分隔
*/
2.4Throwable类的常见方法
1.printStackTrace
展示异常错误信息(位置, 异常类名, 原因)
2.toString
异常的简单描述(异常类名, 原因)
3.getMessage
异常的简单描述(原因)
2.3自定义异常
2.3.1自定义异常的必要
-
更好地描述异常情况:通过自定义异常,我们可以为特定的异常情况提供更准确和详细的描述,使得异常处理更加精确和可读性更高。
-
更好地区分异常类型:自定义异常可以帮助我们区分不同的异常类型,根据不同的异常类型做出不同的处理,提高程序健壮性和可维护性。
2.3.2自定义异常的分类
1.自定义编译时的异常
-
定义一个异常类继承Exception.
-
重写构造器。(自定义类想编写方法,就需要重写构造器)
-
在出现异常的地方用throw new 自定义对象抛出,
public class StudentAgeException extends Exception {
//空参构造
public StudentAgeException() {
}
//带参构造
public StudentAgeException(String message) {
//父类
super(message);
}
}
作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!
2.自定义运行时的异常
-
定义一个异常类继承RuntimeException.
-
重写构造器。
-
在出现异常的地方用throw new 自定义对象抛出!
public class StudentAgeException extends RuntimeException {
public StudentAgeException() {
}
public StudentAgeException(String message) {
super(message);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)