简单的理解"异常"

异常

1.异常的概念

在Java中,将程序执行过程中发生的不正常行为称为异常。

1.1常见的异常

java中不同类型的异常,都有与其对应的类来进行描述。

1. 算术异常

2. 数组越界异常

3. 空指针异常

1.2 异常的体系结构

异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:

  1. Throwable :是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
  2. Error: 指的是Java 虚拟机无法解决的严重问题,比如:JVM 的内部错误、资源耗尽等,典型代表:
    StackOverflowError和OutOfMemoryError,一旦发生回力乏术。
  3. Exception :异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说
    的异常就是Exception。

2.异常的分类

异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为:

    1. 编译时异常 : 在程序编译期间发生的异常,称为编译时异常,也称为受检查异常(Checked Exception)
    1. 运行时异常 : 在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常(Unchecked Exception)

异常的捕获

异常的捕获,也就是异常的具体处理方式

异常的声明-Throws

处在方法声明时参数列表之后,当方法中抛出编译时异常,

用户不想处理该异常,此时就可以借助throws将异常抛 给方法的调用者来处理。

语法

语法格式:

修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2...{ }

【注意事项】

  1. throws必须跟在方法的参数列表之后
  2. 声明的异常必须是 Exception 或者 Exception 的子类
  3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。

异常的捕获-try-catch

throws对异常并没有真正处理,而是将异常报告给抛出异常方法的调用者,由调用者处理。如果真正要对异常进行 处理,就需要try-catch。

语法

java 复制代码
语法格式:
try{
    // 将可能出现异常的代码放在这里
}catch(要捕获的异常类型 e){
    // 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类
    时,就会被捕获到
    // 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
}[catch(异常类型 e){
    // 对异常进行处理
}finally{
    // 此处代码一定会被执行到
}]
// 后序代码
// 当异常被捕获到时,异常就被处理了,这里的后序代码一定会执行
// 如果捕获了,由于捕获时类型不对,那就没有捕获到,这里的代码就不会被执行

实例一

实例二

同时捕获多个异常可以用"|"。

finally

在写程序时,有些特定的代码,不论程序是否发生异常,都需要执行 ,比如程序中打开的资源:网络连接、数据库 连接、IO流等,在程序正常或者异常退出时,必须要对资源进进行回收。另外,因为异常会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的。

csharp 复制代码
语法格式:
try{
// 可能会发生异常的代码
}catch(异常类型 e){
// 对捕获到的异常进行处理
}finally{
// 此处的语句无论是否发生异常,都会被执行到
}
// 如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行

实例

csharp 复制代码
public static void main(String[] args) {
try{
int[] arr = {1,2,3};
arr[100] = 10;
arr[0] = 10;
}catch (ArrayIndexOutOfBoundsException e){
System.out.println(e);
}finally {
System.out.println("finally中的代码一定会执行");
}
System.out.println("如果没有抛出异常,或者异常被处理了,try-catch后的代码也会执行");
}

finally 和 try-catch-finally 后的代码都会执行,那为什么还要有finally呢?

finally中的代码一定会执行的,一般在finally中进行一些资源清理的扫尾工作。

相关推荐
程序员侠客行16 分钟前
Spring事务原理详解 三
java·后端·spring·架构
刃神太酷啦42 分钟前
堆和priority_queue
数据结构·c++·蓝桥杯c++组
落羽的落羽1 小时前
【落羽的落羽 数据结构篇】栈和队列
c语言·数据结构
一个 00 后的码农1 小时前
25林业研究生复试面试问题汇总 林业专业知识问题很全! 林业复试全流程攻略 林业考研复试真题汇总
考研·面试·面试问题·考研复试·考研调剂·面试真题·林业考研
Hello.Reader1 小时前
深入理解 Rust 的 `Rc<T>`:实现多所有权的智能指针
开发语言·后端·rust
yoona10201 小时前
Rust编程语言入门教程(八)所有权 Stack vs Heap
开发语言·后端·rust·区块链·学习方法
qy发大财2 小时前
分发糖果(力扣135)
数据结构·算法·leetcode
滴_咕噜咕噜2 小时前
C#基础总结:常用的数据结构
开发语言·数据结构·c#
haaaaaaarry2 小时前
【分治法】线性时间选择问题
数据结构·算法
CS创新实验室2 小时前
计算机考研之数据结构:P 问题和 NP 问题
数据结构·考研·算法