1.异常的简介
异常,是对程序在运行过程中,遇到的种种的不正常的情况的描述。异常,在Java中,使用 Exception类来描述。如果程序遇到了未经处理的异常,将会导致程序无法编译或无法继续运行。
继承体系的层次结构,参考下图:
2.异常的处理
语法:
try {
// 将可能会出现异常的代码放到这里执行
// 一旦try中的代码出现了异常,则从出现异常的位置开始,到try的大括号的扩回,这一段代码就不执行了。
}catch (需要捕获的异常的类型 标识符) {
// 如果try中的代码出现了异常,并且异常对象的类型和捕获的类型一致
// 这里的代码将会执行
// 一旦一个异常被捕获了,那么这个异常将不再影响程序的编译和执行
}
案例:当除数为 0 时引发的算术异常 ArithmeticException
public class Demo02 { public static void main(String[] args) { int num1 = 10; int num2 = 0; try { int result = divideNumbers(num1, num2); System.out.println("结果: " + result); } catch (ArithmeticException e) { System.out.println("捕获到异常: 除数不能为 0"); } } public static int divideNumbers(int num1, int num2) { return num1 / num2; } }
3.多种异常的处理
语法:
try {
// 可能出现异常的代码
}catch (异常类型1 标识符) {
// 针对异常类型1的处理
}catch (异常类型2 标识符) {
// 针对异常类型2的处理
}catch (异常类型3 标识符) {
// 针对异常类型3的处理
}
案例:
accessArrayElement
方法可能抛出 ArrayIndexOutOfBoundsException
异常,当访问数组越界时。readFile
方法可能抛出 IOException
异常,当文件不存在时。
public class MultipleExceptionExample { public static void main(String[] args) { int[] numbers = {1, 2, 3}; try { // 可能抛出数组越界异常 int element = accessArrayElement(numbers, 5); System.out.println("数组元素: " + element); // 可能抛出文件未找到异常 readFile("nonexistent.txt"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("捕获到数组越界异常"); } catch (IOException e) { System.out.println("捕获到文件相关异常"); } catch (Exception e) { System.out.println("捕获到其他未知异常"); } } public static int accessArrayElement(int[] array, int index) { return array[index]; } public static void readFile(String filePath) throws IOException { FileReader reader = new FileReader(filePath); } }
4.自定义异常
如果系统给我们提供的异常类型,已经不能满足我们的需求了,或者不知道用哪个了。此时就需要进行异常的自定义。
自定义异常:
class NumberException extends RuntimeException { public NumberException(String message) { super(message); } }
测试类:
public class Demo02 { public static void main(String[] args) { int num1 = 10; int num2 = (int)(Math.random()*10+1); try { divideNumbers(num1, num2); } catch (NumberException e) { System.out.println("捕获到异常: num2="+num2+",num1大于num2"); } } public static void divideNumbers(int num1, int num2) { if(num1>num2){ throw new NumberException("报数错误"); } System.out.println("报数正确,num2="+num2); } }
5.throw和throws关键字
throw:
用在程序方法中,表示抛出异常。一个异常对象实例化完成后,没有任何意义,只有当把这个异常抛出之后,这个异常才会生效,具有阻止程序的编译或者运行的意义。
public static void divideNumbers(int num1, int num2) { if(num1>num2){ throw new NumberException("报数错误"); } System.out.println("报数正确,num2="+num2); }
throws:
在方法的定义格式中,也就是形参列表的后面。用于声明异常类型。
public static void checkPayment(int Money,int MealCost) throws NotEnoughMoneyException{ if(MealCost > Money){ throw new NotEnoughMoneyException("小明没有足够的钱来支付饭钱,饭钱为"+MealCost+"元"); } System.out.println("饭钱为"+MealCost+"元,小明可以支付"); }