定义
程序运行过程中发生的意外
异常的处理机制
作用:发生异常时 会跳过异常代码 继续往下执行 不会中断
五大关键字
- try:可能发生异常的代码
- catch:捕获异常 只有在发生异常情况下才会执行
- finally:无论如何都要执行的代码 除非Java虚拟机退出
- throws:声明异常
- whrow:手动抛出异常
常见的异常处理结构
- try-catch
- try-catch-finally
try{
//try块中放可能发生异常的代码。
//如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。
//如果发生异常,则尝试去匹配catch块。
}catch(SQLException SQLexception){
//每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。
//catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
//在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。
//如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器。
//如果try中没有发生异常,则所有的catch块将被忽略。
}catch(Exception exception){
//...
}finally{
//finally块通常是可选的。
//无论异常是否发生,异常是否匹配被处理,finally都会执行。
//一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
- try-finally
- try块不能独立存在
异常处理的执行顺序问题
- try-catch-后续代码
有异常:try->catch->后续代码
无异常:try->后续代码 - try-catch-finally
有异常:try->catch->finally->后续代码
无异常:try->finally->后续代码
public static int getInt() {
try {
System.out.println("11111");
return 2;
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println("0000");
}
return 0;
}
异常中存在return时的执行顺序
- try{return;}catch{}finally
- try{}catch{return;}finally
- 如果try或者catch中有return作为方法放回值 则方法的返回值会提前出结果 但是finall继续执行
public class Test1 {
public static void main(String[] args) {
Test1 test1 = new Test1();
System.out.println(test1.say());
}
public String say() {
String str = "abc";
try {
Integer.parseInt(str);
return "try";
} catch (Exception e) {
System.out.println("catch");
return "catch";
} finally {
System.out.println("finally");
return "finally + return";
}
}
}