异常
Exception:叫做异常,代表程序可能出现的问题。
我们通常会用 Exception 以及它的子类来封装程序出现的问题
运行时异常:RunTimeException 及其子类,编译阶段不会出现异常提醒
运行时出现的异常(如:数组索引越界异常)
编译时异常:编译阶段就会出现异常提醒的(如:日期解析异常)
总结
- 异常体系的最上层父类是谁?异常分为几类?
- 父类:Exception
- 异常分为两类:编译时异常、运行时异常
- 编译时异常和运行时异常的区别?
- 编译时异常:没有继承 RuntimeException 的异常,直接继承于 Exception
编译阶段就会有错误提示,作用在于提醒程序员
- 运行时异常:RuntimeException 本身和子类
编译阶段没有错误提示,运行时出现的,一般是由于参数传递错误带来的问题
异常作用
- 作用一:异常是用来查询bug的关键参考信息
- 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
| 方法名称 | 说明 |
| --- | --- |
|public String getMessage()
| 返回此 throwable 的详细信息字符串 |
|public String toString()
| 返回此可抛出的简短描述 |
|public void printStackTrace()
| 在底层是利用 System.err.println 进行输出
把异常的错误信息以红色字体输出在控制台
细节:仅仅是打印信息,不会停止程序运行 |
抛出处理
异常处理方式
- 捕获:try...catch
一般用在调用处,能让代码继续往下运行
- 抛出:throw throws
在方法中,出现异常了
方法就没有继续运行下去的意义了,采取抛出处理
让该方法结束运行并告诉调用者出现了问题
自定义异常
- 定义异常类
- 写继承关系
- 空参构造
- 带参构造
1.异常处理机制
捕获多个异常:从小到大
try{
// 语句块
if(b == 0){
throw new ArithmeticException(); // throw 主动抛出异常
}
} catch (Throwable){ // 要捕获的异常
} finally { // 处理善后工作,可写可不写。
}
// throws 当前不处理异常,向上抛出异常
public void test(int a, int b) throws Exception{
if(b == 0){
throw new ArithmeticException(); // 主动抛出异常,一般在方法中用
}
2.编译时异常和运行时异常
运行时异常:
- 都是
RuntimeException
类及其子类异常,如NullPointerException
(空指针异常)、IndexOutOfBoundsException
(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。 - 这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,当程序中可能出现这类异常,即使没有用try-catch
语句捕获它,也没有用throws
子句声明抛出它,也会编译通过。
非运行时异常 (编译时异常):
- 是
RuntimeException
以外的异常,类型上都属于Exception
类及其子类。 - 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
- 如
IOException、SQLException
等以及用户自定义的Exception
异常,一般情况下不自定义检查异常。
Throwable分类图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义