异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算数异常,例如零作除数时 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 无法加载所需类 |
IIIegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式化转换异常,如把“abc”转换成数字 |
1.使用一系列的逻辑判断,来提前进行异常情况判断,从而规避异常代码的执行
2.代码冗余、代码可读性差
3.不是所有的异常都能规避,例如:java.util.InputMismatchException
System.out.println("请输入被除数:");
int num1 = input.nextInt(); //java.util.InputMismatchException
1.将可能出现异常的代码,写在try代码块中
// 测试用例1
private static void test01() {
Scanner input = new Scanner(System.in);
System.out.println("请输入被除数:");
int num1 = input.nextInt(); // java.util.InputMismatchException
System.out.println("请输入除数:");
int num2 = input.nextInt(); // java.util.InputMismatchException
// if (num2 == 0) {
// System.out.println("除数不能为0");
// return;
// }
try {
System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
} catch (ArithmeticException e) {
//e.printStackTrace(); // 打印栈信息,打印异常详细信息
System.out.println("除数不能为0");
}
System.out.println("程序结束");
input.close();
}
2.catch后编写可能出现的异常类参数(可以用|分隔多个异常,也可以使用异常父类表示所有子类型)
// 测试用例2
private static void test02() {
Scanner input = new Scanner(System.in);
try {
System.out.println("请输入被除数:");
int num1 = input.nextInt(); // java.util.InputMismatchException
System.out.println("请输入除数:");
int num2 = input.nextInt(); // java.util.InputMismatchException
System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
} catch (InputMismatchException e1) {
System.out.println("输入必须是整数");
} catch (ArithmeticException e2) {
System.out.println("除数不能为0");
}
System.out.println("程序结束");
input.close();
}
// 测试用例3
private static void test03() {
Scanner input = new Scanner(System.in);
try {
System.out.println("请输入被除数:");
int num1 = input.nextInt(); // java.util.InputMismatchException
System.out.println("请输入除数:");
int num2 = input.nextInt(); // java.util.InputMismatchException
System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
} catch (InputMismatchException | ArithmeticException e) {
System.out.println("程序出现异常");
}
System.out.println("程序结束");
input.close();
}
// 测试用例4
private static void test04() {
Scanner input = new Scanner(System.in);
try {
System.out.println("请输入被除数:");
int num1 = input.nextInt(); // java.util.InputMismatchException
System.out.println("请输入除数:");
int num2 = input.nextInt(); // java.util.InputMismatchException
System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
} catch (Exception e) {
System.out.println("程序出现异常");
}
System.out.println("程序结束");
input.close();
}
3.catch代码块编写的是异常情况下的执行代码
4.catch可以多重使用,从而处理可能出现的多种异常
1.无论程序是否出现异常,都将执行的代码(finally优先级高于return,finally执行完后才会执行return)
//唯一不执行的情况
try {
System.out.println("test");
System.exit(1);//关闭虚拟机,参数为0正常退出,非0为异常退出
} finally {
System.out.println("执行finally");//未执行
}
2.finally和catch可以只用其一,也可以一起使用,但是try不能单独使用
private static void test05() {
Scanner input = new Scanner(System.in);
try {
System.out.println("请输入被除数:");
int num1 = input.nextInt(); // java.util.InputMismatchException
System.out.println("请输入除数:");
int num2 = input.nextInt(); // java.util.InputMismatchException
System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
} catch (Exception e) {
System.out.println("程序出现异常");
} finally {
System.out.println("finally执行");
}
System.out.println("程序结束");
input.close();
}
1.用来声明方法可能出现的异常
2.方法本身无需处理异常
3.方法的调用者处理异常
private static void test06() throws Exception {
Scanner input = new Scanner(System.in);
System.out.println("请输入被除数:");
int num1 = input.nextInt(); // java.util.InputMismatchException
System.out.println("请输入除数:");
int num2 = input.nextInt(); // java.util.InputMismatchException
System.out.println("结果:" + num1 / num2); // java.lang.ArithmeticException
System.out.println("程序结束");
input.close();
}
1.用在方法体中,用于抛出异常,例如:throw new Exception(“姓名不能是lucy”);
private static void test07() throws Exception {
Scanner input = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = input.next();
if (name.equals("lucy")) {
throw new Exception("姓名不能是lucy");
}
System.out.println(name);
input.close();
}
1.异常体系架构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTmDoRD7-1648356738902)(E:\note\img\java异常架构图.png)]
2.编译时异常:要求程序员必须处理(声明或者try),在程序编译过程中就会出现的错误。
3.运行时异常:可以不处理,在程序运行时可能出现的错误。
1.继承Exception类创建编译时自定义异常
2.继承RuntimeException类创建运行时自定义异常
input.close();
}
## 异常的分类
1.异常体系架构图
[外链图片转存中...(img-xTmDoRD7-1648356738902)]
2.编译时异常:要求程序员必须处理(声明或者try),在程序编译过程中就会出现的错误。
3.运行时异常:可以不处理,在程序运行时可能出现的错误。
## 自定义异常类
1.继承Exception类创建编译时自定义异常
2.继承RuntimeException类创建运行时自定义异常