介绍
在Java中,异常(Exception)是指程序执行过程中可能出现的不正常情况或错误。它是一个事件,它会干扰程序的正常执行流程,并可能导致程序出现错误或崩溃。
异常可以是由Java虚拟机(JVM)自动抛出的,也可以由程序员显式地抛出。异常提供了一种机制,使得开发人员能够对错误进行处理,而不是简单地中断程序的执行。
异常在Java中是以对象的形式表示的,这些对象是从java.lang.Throwable类或其子类派生而来。Throwable是异常类层次结构的根类,它有两个主要的子类:java.lang.Exception和java.lang.Error。
Error(错误):java.lang.Error 一般表示编译时或者系统错误,例如:Virtual MachineError(虚拟机运行错误),StackOverflowError:栈溢出错误、OutOfMemoryError:内存不足错误等。此类错误开发者无法处理且不可恢复,JVM 将终止线程,因此不应该实现任何新的 Error 子类。
Exception(异常):java.lang.Exception 指程序本身可以捕获并且可以处理的异常,也就是要么捕获异常并作出处理,要么继续抛出异常。Exception 这种异常又分为两类:运行时异常和非运行时异常。
运行时异常(非检查异常):RuntimeException 及其子类都统称为运行时异常,例如:NullPointExecrption(空指针)、ArithmeticException(算术错误)、ArrayIndexOutOfBoundsException(数组越界)等。这类异常是非受检查的,具体根据需要来判断是否需要捕获和处理,并不会在编译期强制要求。开发者应该从程序编码阶段就尽可能避免其发生。
非运行时异常(检查异常):RuntimeException 以外的异常都属于非运行时异常。例如 IOException、SQLException 等以及用户自定义的 Exception 异常等。这类异常是受检查的,在源代码里必须显式地进行捕获处理,是编译期检查的一部分。这种异常要么用 try-catch 语句捕获它,要么用 throws 子句声明抛出它,否则编译不会通过。
异常处理
异常提供了一种机制,使得开发人员能够对错误进行处理,而不是简单地中断程序的执行。java提供两种对异常处理的方式:抛出异常、捕获异常
抛出异常
在Java中,异常的抛出是通过使用throw关键字来实现的。throw关键字用于抛出一个异常对象,将异常传递给调用者或上层调用栈。
捕获异常
在Java中,可以使用try-catch-finally语句块来捕获和处理异常。try-catch-finally语句块允许我们在执行可能引发异常的代码时,捕获并处理异常,从而防止程序终止或产生不可预测的结果。
实例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Example {
public static void main(String[] args) {
try {
String str=null;
System.out.println("长度:" + str.length());
int result = divide(10, 0); // 调用自定义方法
System.out.println("结果:" + result);
} catch (ArithmeticException e) {
System.out.println("发生了算术异常:" + e.getMessage());
} catch (Exception e) {
System.out.println("其他异常:" + e.getMessage());
} finally{
System.out.println("可以运行清理类型等收尾善后性质的语句");
}
}
public static int divide(int num1, int num2) {
try {
return num1 / num2;
} catch (ArithmeticException e) {
throw new ArithmeticException("除数不能为零"); // 抛出算术异常
}
}
}
注:
1、try 不能单独存在,可以try-catch、try-catch-finally或try-finally。
2、finally可能也不会执行:
- 在前面的代码中用了 System.exit()退出程序。
- finally 语句块中发生了异常。
- 程序所在的线程死亡。
3、try-catch时,如果有多个catch并且存在父子关系时把子类放前面。