异常
1、简介
程序中出现错误,导致程序不能运行,我们称为
异常
。
2、try-catch
2.1、引入
我们写一个程序,当然希望程序能正常运行下去,但我们避免不了程序可能出现的异常,为了程序的正常运行,我们希望即使抛出异常,也能正常运行,而try-catch正有此功能。
2.2、使用方法
我们把有可能出现的代码放入try代码块中,可以通过catch捕获try代码块中有可能出现的异常,随后执行catch代码块中的代码,
如果捕获到相关异常,那么try-catch后面的代码无影响正常运行。
2.3、运行原理
-
第一种情况:
try中没有异常,那么catch中的代码不执行。 -
第二种情况:
try中有异常,但是不是catch所捕获的异常类型,相当于程序遇到异常,程序报错不执行下面的代码。 -
第三种情况:
try中有异常,并且被catch捕获到了,那么执行catch中的代码,catch代码块外的后续代码正常执行。
特别地,当
try
中异常被
catch
捕获到,那么
try
中出现异常的那段代码下面的代码就不会执行。
3、catch如何处理异常
-
第一种处理:
什么都不做。 -
第二种处理:
继续向外抛出异常,让JVM处理。 -
第三种处理:
主动处理,捕获到异常执行自己处理异常的代码逻辑。 -
第四种处理:
输出自定义异常。 -
第五种处理:
打印异常信息。
3.1、try-catch后面的代码什么时候不执行?
- try中出现异常,但没有被catch捕获到 。
- catch中主动抛出异常。
- try中有返回值。
4、try-catch-finally
必须执行的代码可放在finally中,无论如何这个代码必会执行。
当然如果在try直接终止虚拟机 ,那么finally不会执行。
4.1、try中有return那么finally执不执行?
这个问题:主要看哪个先执行
先执行finally后执行return。
5、多重catch
try中出现异常后,跟后面catch的异常类型一个一个比较,执行第一个与之匹配的catch中的代码块,
一旦执行第一个之后,后面的catch就不执行了。
所以在catch捕获异常的时候,得将特殊的异常类放在前面,一般的放后面 (简而言之,就是先小异常,后大异常)
5.1、JDK1.7之后
可将异常并列:
public static void main(String[] args) {
try {
int i = 1 / 0;
} catch (IllegalArgumentException | ArithmeticException | NullPointerException e) {
System.out.println("程序出异常啦!" + e);
}
}
6、异常分类
7、throw与throws
区别 | throw | throws |
---|---|---|
位置不同 | 在方法中 | 在方法声明处 |
内容不同 | 抛出的是异常对象 |
抛出异常类型(可多个,用
拼接) |
作用不同 | 能定位到异常源头 | 告诉开发人员方法内部可能存在异常 |
8、重载与重写异常
父类异常要大于等于子类异常!
9、自定义异常
- 如果我们继承运行时异常,则不需要额外处理,会在运行时抛出。
-
如果是检查异常,需要我们在代码中就要用
try-catch
捕获,或者
throws
抛出