1.定义
程序在运行过程中产生的错误的现象叫做异常;异常是一种运行时错误,它是程序在运行时,由于系统检测到了不可能执行的操作而引起的;这时候系统不再执行下去,提前结束。这种情况就是
不处理异常的程序可能会在不期望终止的时候终止,导致部分系统资源没有得到释放,有可能引发严重的问题。
2.异常的处理和层次结构
//throws关键字可以在方法上声明该方法要抛出的异常,然后在方法内部通过throw抛出异常对象。
private void exception() throws InterruptedException {
try {//try是用于检测被包住的语句块是否出现异常,如果有异常,则抛出异常,并执行catch语句
Thread.sleep(100);
} catch (InterruptedException e) {//cacth用于捕获从try中抛出的异常并作出处理。
throw e;//throw用于抛出异常。
}finally {//finally语句块是不管有没有出现异常都要执行的内容
}
}
Java语言中的异常捕获结构由try、catch、finally这三部分组成;其中
- try:语句块存放的是可能会发生异常的语句;
- catch:程序块放在try语句块之后,用来激发被捕获的异常;
- finally:语句块是异常处理结构的最后执行部分,无论try块中的代码如何退出,最后都会执行finall语句。
Java类库中的每个包都定义了异常类,所有的这些类都是Throwable类的子类。Throwable类派生了两个子类Exception类和Error类。
- Exception:处理用户程序应当捕获的异常情况;
- Error:Error类的异常为内部错误,用来描述Java系统在内部错误以及资源耗尽的错误;因此在正常的情况下不期望程序捕获它们;
- Throwable:可抛出的。
补充:
1.检验异常是指程序代码中必须要捕获的异常(在函数内抛出,函数必须声明,因为调用者对该异常进行处理),否则无法通过编译;
2.非检验异常是指可不捕获程序仍可以通过编译的异常。
RuntimeException及其子类都属于非检验异常,其他异常为检查异常;RuntimeException不需要程序员捕获处理。
3.运行时异常如果在函数内抛出,在函数是上不需要声明(原因:不需要调用者处理,运行时发生异常,程序已经无法继续运行,所以,不让调用者处理直接让程序停止,由调用者对代码进行修正。)
4.这个体系中的所有类和对象都具备一个独特的特点就可抛性
3.常见的异常类
4.try-catch
5.finally
注意:
1.当已经了System.exit(0)//退出JVM;只有这种情况下不会执行finally语句块;
2.如果在finally块中有return语句的话,那么它将会覆盖函数中其他的return 语句。
示例代码1:
public class test {
public static void main(String[] args){
int num = 10;
System.out.println(test(num));
}
private static int test(int b) {
try{
b += 10;
return b;
}catch(RuntimeException e){
}catch (Exception e) {
}finally{
b += 10;
return b;
}
}
}
上面代码中虽然try块中有return语句,但是最终会执行finally块中return语句,局部变量b执行了两次加10操作,所以最终的结果是返回30;
运行结果:30
示例代码2:
package dong.test;
public class Test {
public static String output = "";
public static void foo(int i){
try{
if(i == 1){
throw new Exception();
}
}catch(Exception e){
output += "2";
return;
}finally{
output += "3";
}
output +="4";
}
public static void main(String[] args){
foo(1);
System.out.println(output);
}
}
运行结果:
23
上面的代码中会抛出一个异常,然后就会在catch语句块中进行异常处理;虽然catch语句块中有return 语句,但是finally中的内容必须进行,所以先执行了finally才进行return 操作;return后 output +=“4”不会被执行。
6.多重catch
1.使用多重catch语句时,异常子类一定要位于异常父类之前
2.在Java7中,当需要catch多个异常的时候可以使用管道符(|)将它们分开,这个异常参数变量(ex)是定义为final的:如下
catch(IOException | SQLException | Exception ex){
}