异常的捕获与处理
程序员文章站
2022-04-01 11:28:45
...
异常的捕获与处理
处理异常
组合方式:try…catch、try…catch…finally、try…finally
public class TestMain {
public static void main(String[] args) {
try {
System.out.println(5 / 0);
} catch(ArithmeticException e) {
System.out.println("出现算数异常:");
e.printStackTrace(); //输出异常的完整信息
}finally{
System.out.println("运行结束");
}
}
}
异常处理流程
所有异常类都是Throwable子类
Error与Exception的区别?
- Error:指的是JVM错误,即程序还没有执行,用户无法进行处理。
- Exception:指的是程序运行中产生的异常,用户可以处理。
请解释Java中的异常处理流程:
- 程序运行过程中出现异常后,JVM自动根据异常类型实例化一个与之类型匹配的异常类对象。
- 产生异常对象后,判断是否有异常处理。
- 有:由try语句捕获产生的异常类实例化对象,再与每一个catch进行比较。如果匹配,则处理异常。
- 没有:交由JVM进行默认处理,输出异常信息,结束程序调用。
- 无论异常处理是否匹配,都要向后执行finally语句。如果之前处理过异常,那么程序自然结束,否则交由JVM默认处理。
使用Exception处理异常
public class TestMain {
public static void main(String[] args) {
try {
System.out.println(5 / 0);
} catch(Exception e) {
System.out.println("出现balabala异常:");
e.printStackTrace(); //输出异常的完整信息
}finally{
System.out.println("运行结束");
}
}
}
使用须知:
- 存在多个catch时,捕获范围大的异常一定得放在捕获范围小的异常之后,否则程序编译错误。
- Exception虽然比较方便,但所有异常都会按照同一种方式进行处理。异常分开处理更好。
Exception与RuntimeException的区别?并列举几个常见的RuntimeException
- Exception是RuntimeException的父类
- Exception所定义的异常必须要被处理,而RuntimeException的异常可以选择性处理。
- 常见RuntimeException:ArithmeticException、NullPointerException、ClassCastException(转换异常类)
throws关键字
throws关键字主要用于方法声明,当方法中出现异常后,交由被调用处进行处理。
class MyMath {
//此方法里产生的异常交给被调用出进行处理
public static int div(int x, int y) throws Exception {
return x / y;
}
}
public class TestMain {
public static void main(String[] args) {
try {
System.out.println(MyMath.div(10, 0)); //这里调用
}catch(Exception e) {
System.out.println("出错了!");
e.printStackTrace();
}
}
}
由以上例子可以发现:
- 调用了具有throws声明的方法后,不管操作是否会出现异常,都必须进行异常处理。
- throws声明的方法所产生的异常的范围,必须必catch中的小。
- 主方法如果抛出异常,则由JVM进行处理。(但主方法不应该用throws声明)
throw关键字
使用throw可以手动的抛出异常的实例化对象。
public class TestMain {
public static void main(String[] args) {
try {
throw new Exception("自定义异常"); //抛出一个自定义异常
}catch(Exception e) {
e.printStackTrace();
}
}
}
throw与throws的区别?
- throw:指的是手动的抛出一个异常类对象。
- throws:声明方法时使用, 表示此方法在调用时必须处理异常。