1. 异常的概述
在编程中,我们经常遇到各种不可预见的问题,例如:文件找不到、网络连接失败、数组越界等。这些问题我们通常称之为“异常”(Exception)。
java 把异常当作对象来处理,并定义了一个基类 java.lang.Throwable作为所有异常的超类。 java.lang.Throwable主要分为两类 错误Error 和 Exception 。
常用概念:
- 异常类(Exception class): Java 中的所有异常类都继承自 java.lang.Throwable 类。
- Error:这是 Throwable 的一个子类,错误通常包含那些不应由应用程序处理的严重问题。
- Exception:这是 Throwable 的另一个子类,它表示程序可 以处理的问题。比如尝试打开一个不存在的文件等。
- 抛出异常(Throwing an exception):当程序发生一个异常时,会创建一个异常对象,并将其抛出,提交给 Java 运行时系统。
- 捕获异常(Catching an exception):这是对抛出异常的响应。当一个方法抛出一个异常时,这个异常可以被另一个方法捕获并处理
- 检查异常(Checked Exceptions):编译器要求必须处置的异常。对于 Exception 及其子类(不包括 RuntimeException 及其子类),编译器强制我们在可能抛出异常的代码中使用 try-catch 语句,或者将异常传递给调用者(通过在方法签名中添加 throws 子句)
- 非检查异常(Unchecked Exceptions):对于 RuntimeException 及其子类,编译器并不强制我们处理或声明它们。我们可以选择捕获它们,但也可以忽略它们,让它们在程序运行时自动抛出。非检查异常通常由程序逻辑错误引起,我们应该通过改正程序来避免它们,而不是试图恢复
2.异常的体系结构
任何可以作为参数传递给 catch 子句的类都必须是 java.lang.Throwable 类或者其的子类
Exception 类主要有两个子类:IOException 和 RuntimeException。IOException 类是那些可能会导致输入输出操作失败的异常,例如读取不存在的文件。而 RuntimeException 则包括程序逻辑错误,如数组越界、空指针访问等
3.异常的用途
- 错误处理:最直接的用途就是处理错误。例如,当你尝试打开一个不存在的文件或者尝试连接一个无法响应的网络服务时,Java 会抛出一个异常。你可以捕获这个异常并决定如何处理它,例如,重新尝试操作,或者显示一条错误信息。
- 通过错误处理可以避免 JVM 直接停止,防止程序直接崩了
- 流程控制:虽然使用异常来做流程控制不是一个良好的编程习惯,但在某些特殊情况下,它可以作为一种很有效的流程控制手段。例如,在一个大的循环结构中,当满足特定条件时,你可能希望退出循环,这时可以抛出一个异常。
4.Throwable 类
4.1Throwable 类里常用方法包括:
- public String getMessage():返回关于发生的异常的详细信息。这个信息在 Throwable 对象被创建时通过其构造函数设置。
- public Throwable getCause():返回导致异常的原因,或者如果原因不存在或未知,则返回 null。
- public String toString():返回一个简短的描述,包含异常的类型和详情信息。
- public void printStackTrace():将此 Throwable 及其回溯打印到标准错误流。
4.2 抛出异常的过程
- 通过使用 new 关键字 + Throwable 类或其子类的构造函数来创建一个 Throwable (子类)对象
- 使用 throw 关键字来抛出 Throwable(子类)对象。
- throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开
修饰符 返回值类型 方法名() throws 异常类型1,异常类型2{
//注意上面这里是throws,不是throw。而且是异常类型,不是对象
if (判断条件) {
//注意此处是throw,不是throws,而且是异常对象
throw new 异常对象("异常的原因");
}
//方法体
}
//生成异常对象是实例,这里的Throwable也可以用其子类代替
Throwable throwable = new Throwable(”发现一个异常!“);
throw throwable;//注意此处是throw,不是throws
4.3 捕获异常与处理异常
- try-catch 语句
使用 try-catch 语句来捕获和处理异常。在 try 块中,我们放入可能会抛出异常的代码,然后在后面的 catch 块中捕获抛出的异常对象并处理这些异常。
/*多个异常一次捕获一次处理 + 没写finally*/
try{
//可能会抛出异常的代码块
}catch(异常类型**对象**){
//处理异常的代码块
}
- try-catch-finally 语句
/*多个异常一次捕获多次处理 + fianlly*/
try {
// 可能抛出异常的代码
} catch (ExceptionType1 e) {
// 处理 ExceptionType1 异常
} catch (ExceptionType2 e) {
// 处理 ExceptionType2 异常
} finally {
// 无论是否抛出异常,都将执行的代码
}
-
多次处理实际上是一次处理
-
多个catch的效果像 if ... else if 一样,所以在前面的判断条件需要弱于后面的,不然后面的catch永远不会执行。所以 前面的异常类型 不能是 后面异常类型的父类。
-
有关 finally { }:
-
无论异常是否发生,finally 内的语句都需要执行。因为异常会引发程序跳转,导致有些语句执行不到。而 finally 就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的
-
finally不能单独使用。必须配合着try…catch使用
-
当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行。
-
通常在finally 代码块内添加语句来释放占用的资源
-
-
多个异常使用捕获又该如何处理呢?
-
多个异常分别处理
-
多个异常一次捕获多次处理
-
多个异常一次捕获一次处理
-
4.4 assert 断言
assert condition : error message;
// condition 是一个布尔类型的条件表达式,表示需要检查的条件
//error message 是一个字符串类型的错误提示信息
//如果 condition 的值为 false,则程序会在此处抛出 AssertionError 异常,输出 error message 指定的错误提示信息。
- 断言是编程中常用的一种技术手段,它用于在程序执行时验证某些条件是否满足。如果条件成立,则程序继续执行;否则程序抛出AssertionError 异常,直接终止。
- 注意!!!AssertionError 继承自 Error 类,是一个严重的错误,表示程序已经出现了无法处理的异常情况,会导致程序直接终止
- 断言的主要作用是在开发和调试阶段快速定位和解决问题,有效避免因为程序中存在非预期的逻辑错误而导致程序崩溃或产生误判的情况。相对于传统的 if/else 或 try/catch 方式,使用 assert 断言可以更加简洁明了地表达程序的状态或逻辑关系,提高程序的可读性和可维护性。
- 在使用 assert 断言时,需要注意断言语句只是一种辅助手段,不能替代异常检查。如果某个条件验证失败会产生正常异常,那么应该使用传统的异常处理机制来处理,并不应该使用断言语句。
5.自定义异常
- 自定义异常类 其实很简单, 只需要继承 Exception 类就行了
public class MyException extends Exception{
//构造器
//带参构造器
//重写toString()
}
源码示例: ArrayIndexOutOfBoundsException类(数组索引越界)
public class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException {
private static final long serialVersionUID = -5116101128118950844L;
/**
* Constructs an <code>ArrayIndexOutOfBoundsException</code> with no
* detail message.
*/
public ArrayIndexOutOfBoundsException() {
super();//源码溯源会发现是在套娃调用 Exception 类内的方法
}
/**
* Constructs a new <code>ArrayIndexOutOfBoundsException</code>
* class with an argument indicating the illegal index.
*
* @param index the illegal index.
*/
public ArrayIndexOutOfBoundsException(int index) {
//实际上就是toSting()
super("Array index out of range: " + index);
}
/**
* Constructs an <code>ArrayIndexOutOfBoundsException</code> class
* with the specified detail message.
*
* @param s the detail message.
*/
public ArrayIndexOutOfBoundsException(String s) {
super(s);//本质还是toString,不过这个是为了让其子类套娃调用
}
}
6.日志
待填坑(后期更新)
标签:抛出,try,finally,Day17,catch,Throwable,日志,异常 From: https://www.cnblogs.com/wendao101/p/17875555.html