1什么是异常?
异常是程序中导致程序运行中断运行的一种指令流
(程序运行爆红)
例如运行以下代码:
public class Demo1 {
public static void main(String[] args) {
System.out.println(10/0);
}
}
会得到
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Java异常处理.Demo1.main(Demo1.java:6)
2异常体系结构
异常指的是Exception , Exception类, 在Java中存在一个父类Throwable(可能的抛出)Throwable存在两个子类:
1.Error:表示的是错误,是JVM发出的错误操作,只能尽量避免,无法用代码处理。
2.Exception:一般表示所有程序中的错误,所以一般在程序中将进行try…catch的处理。
**异常分为两种:
- 受检查异常(在代码运行是出现的异常)
- 不受检查异常RuntimeException(写了错误代码代码下面有红线)**
3如何处理异常
如果需要对异常进行处理,则必须采用标准的处理格式try+catch处理
语法类似于if else判断语句
try {
// 有可能发生异常的代码段
} catch (异常类型1 对象名1) {
// 异常的处理操作
} catch (异常类型2 对象名2) {
// 异常的处理操作
} finally {
// 异常的统一出口
// 无论发生异常finally必然执行(除非程序退出(System.exit()) 或者电脑断电)
}
try+catch的处理流程:
- 一旦产生异常,则系统会自动产生一个异常类的实例化对象。
- 那么,此时如果异常发生在try语句,则会自动找到匹配的catch语句执行,如果没有在try语句中,则会将异 常抛出.
- 所有的catch根据方法的参数匹配异常类的实例化对象,如果匹配成功,则表示由此catch进行处理。
异常处理案例
public class Test1 {
public static void main(String[] args) {
System.out.println("用户输入: " + menu());
}
public static int menu() {
System.out.println("请根据提示,选择功能序号: ");
System.out.println("1. 增加XX");
System.out.println("2. 删除XX");
System.out.println("3. 修改XX");
System.out.println("0. 退出");
Scanner input = new Scanner(System.in);
int num = -1;
try {
num = input.nextInt();
if (num < 0 || num > 3) {
//程序有问题,输入有误
System.out.println("功能序号必须是0,1,2,3");
return menu(); // 重新运行程序,让用户重新输入数字
}
return num;
} catch (InputMismatchException e) {
// 补救
System.out.println("必须入数字");
return menu();
}
}
}
3.1多异常处理
方法1:多catch几个异常
try {
Scanner input = new Scanner(System.in);
int x = input.nextInt();
int y = input.nextInt();
System.out.println(x / y);
} catch (InputMismatchException e) {
// 异常1输入错误
System.out.println("必须入数字");
} catch (ArithmeticException e1) {
// 异常2数学错误
System.out.println("分母不能为0");
}
方法2:使用多态
try {
Scanner input = new Scanner(System.in);
int x = input.nextInt();
int y = input.nextInt();
System.out.println(x / y);
} catch (RuntimeException e) {
// RuntimeException是InputMismatchException 和 ArithmeticException 的父类
System.out.println("输入错误");
}
3.2抛出异常(throws)
throws关键字主要在方法的声明上使用,表示方法中不处理异常,而交给调用处处理
异常是抛出还是catch,应该怎么思考?
若果是传的参数导致异常,应该通过throws将异常抛出
3.3 throw关键字
在编程过程中会出现程序运行合理但现实逻辑不合理的情况这个时候需要人为抛出异常。
从异常处理机制来看,所有的异常一旦产生之后,实际上抛出 的就是一个异常类的实例化对象,那么此对象也可以由throw直接抛出。
例子:
设定年龄
public void setAge(int age) {
if (age < 0 || age > 200) {
RuntimeException e = new RuntimeException("年龄不合理");
throw e;
}
}
如果输入负数年龄虽然程序运行没问题,但是不符合现实逻辑,这个时候就可以人为抛出一个异常