一、异常的处理机制
1.使用try…catch捕获异常
try {
System.out.println(1/0);
} catch (Exception e) {
//打印异常的详细描述字符串
System.out.println(e.getMessage());
//打印异常的跟踪栈
e.printStackTrace();
}
}
2.异常类的继承
异常类的顶级父类 Throwable 派生了两个子类 Error 和 Exception ;
Error 错误 一般指与虚拟机相关的问题,无法通过catch捕捉,通常应用程序无法处理这些错误。
Exception 异常 则可以通过catch来捕获这些异常;
在多catch时遵守:先小类,后大类 的原则;
try {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = a / b;
System.out.println("两个数相乘的结果" + c);
}
catch (IndexOutOfBoundsException e) {
System.out.println("数组越界:运行程序时输入的参数个数不够");
}
catch (NumberFormatException e) {
System.out.println("数字格式异常 只能输入整数");
}
catch (ArithmeticException e) {
System.out.println("算术异常");
}
catch (Exception e) {
System.out.println("未知异常");
}
3.使用finally回收资源
- 无论是否出现异常都会执行到finally块;
- finally块中的return,throw会导致 try 块中的语句失效,所以尽量别在finally块中使用这些结束程序的语句;
- finally块可以和可以和catch块一起出现配合try使用,也可以只出现其中一个配合try块使用。但是try块不能单独出现使用。
- 在jdk7以后允许将需要将一定需要回收的资源定义在try()的小括号中,在程序执行完之后会有隐式的finally将其回收
二、Checked异常和Runtime异常
1.两者的概述和比较
Exception 异常 分为 checked异常 和 runtime异常,runtime异常指的是RuntimeException及其子类。而checked异常则是出了RuntimeException的其他Exception类。
两者相比:checked异常必须显示的抛出异常,或者通过 try…catch捕捉。而runtime不需要显示的抛出异常,在需要的时候同样可以通过 try…catch捕捉。相比下runtime更加灵活,checked更加警示程序员;
2.使用throws声明抛出异常
在不知道怎么处理异常时可以使用throws抛出异常,该异常由上一级调用者处理。如果main方法也不知道如何处理异常,则交给JVM处理;
tip:被调用者的异常类不能比调用者大
下面的例子调用者的异常类是被调用的父类,程序无异常;
public static void test() throws ArithmeticException {
System.out.println(1/0);
}
public static void main(String[] args) throws Exception {
test();
}
三、使用throw抛出异常
使用 throw 可以自行抛出异常;
throw抛出的不是一个异常类,而是一个异常实例;
可以自行抛出异常,而不是通过系统抛异常,可以通过程序员自主定义,在开发中可以使得异常处理更加的灵活。
//写法是错误的,只是想使用一下throw方法,qwq
public enum light{ red,green,yellow }
if(Object c != light){
throw new Exception("输入错误");
}