异常处理
- 异常体系图
- 常见运行时异常
- 异常处理方式try-catch-finall
- [throws/throw 关键字](#throws/throw 关键字)
-
- [throw 关键字](#throw 关键字)
- [throws 关键字](#throws 关键字)
- 声明异常类
- 通用异常
执行过程中发生的异常事件分为两大类:
- Error(错误):Java虚拟机无法解决的严重问题。
- Exception:其它因编程错误或偶然的外在原因导致一般性问题,可以使用针对的代码进行处理。Exception分为两大类:运行时异常,和编译时异常。
异常体系图
- 异常分为两大类,运行时异常和编译时异常.
- 运行时异常,编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。
- 对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
- 编译时异常,是编译器要求必须处置的异常。
常见运行时异常
1.NullPointerException空指针异常:
java
String str = null;
System.out.println(str.length());
2.ArithmeticExceptiom数字运算异常:
分母为0
3.ArrayIndexOutOfBoundsException:数组下标越界异常
java
int[] arr = {1,2,3};
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]);
}
4.ClassCastException类型转换异常:
当试图将对象强制转换为不是实例的子类时,抛出该异常。
5.NumberFormatException:
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常=>使用异常我们可以确保输入是满足条件数字。
异常处理方式try-catch-finall
捕获异常:
java
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
多重捕获块:快捷键 ctrl+alt+t
java
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}finally{
//1.finally 关键字用来创建在 try 代码块后面执行的代码块。
//2.无论是否发生异常,finally 代码块中的代码总会被执行。
//3.在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
}
- 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块
- 如果异常没有发生,则顺序执行try的代码块,不会进入到catch
- 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finally
throws/throw 关键字
throw 和 throws 关键字是用于处理异常的。
throw 关键字用于在代码中抛出异常,而 throws 关键字用于在方法声明中指定可能会抛出的异常类型。
throw 关键字
用于在当前方法中抛出一个异常。
通常情况下,当代码执行到某个条件下无法继续正常执行时,可以使用 throw 关键字抛出异常,以告知调用者当前代码的执行状态。
例如,下面的代码中,在方法中判断 num 是否小于 0,如果是,则抛出一个 IllegalArgumentException 异常。
java
public void checkNumber(int num) {
if (num < 0) {
throw new IllegalArgumentException("Number must be positive");
}
}
throws 关键字
处理机制图:try-catch-finally和throws二选一
用于在方法声明中指定该方法可能抛出的异常。当方法内部抛出指定类型的异常时,该异常会被传递给调用该方法的代码,并在该代码中处理异常。
例如,下面的代码中,当 readFile 方法内部发生 IOException 异常时,会将该异常传递给调用该方法的代码。在调用该方法的代码中,必须捕获或声明处理 IOException 异常。
java
public void readFile(String filePath) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(filePath));
String line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
reader.close();
}
声明异常类
编写自己的异常类时需要记住下面的几点。
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
java
class MyException extends Exception{
}
通用异常
在Java中定义了两种类型的异常和错误。
- **JVM(Java虚拟机) **异常:由 JVM 抛出的异常或错误。例如:NullPointerException 类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。
- **程序级异常:**由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,IllegalStateException 类。