异常就是代表程序出现的问题
Error:
代表系统级别错误,系统一旦出现问题,sun公司会把这些错误封装跟我们程序员没关系
Expection:
叫做异常,代表程序可能出现的问题。通常用他和他的子类来封装程序中出现的问题
编译时异常:编译阶段就会出现异常提醒。(提醒程序员检查本地信息,告诉程序员如果有问题会出这个异常)在编译阶段必须要手动进行异常处理,否则代码报错。
运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。运行时出现的异常。
编译阶段不需要处理的,是代码运行时出现的异常。
异常的作用:
一:异常是用来查询bug的关键信息
如上图,第一行的是异常的信息,at后面跟的是异常所在的位置
二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层执行情况
异常的处理方式:
1.try-catch-finally捕获异常自己处理
当代码出现异常,能进行处理并接着往下运行下去。
格式:try{可能出现异常的代码}catch(异常 e){处理的方案}fianally{一定被执行}
例子:
inr arr[5]{1,2,3,4,5}; System.out.println(arr[10]);//索引越界出错 System.out.println("1");//不执行 //修改后 inr arr[5]{1,2,3,4,5}; try {System.out.println(arr[10]);//索引越界出错 System.out.println("2");//不执行 } catch(ArrayIndexOutOfBoundsExpection e){ System.out.println("3");执行 } finally{ Sys.out.println("4")//finally块中的代码一定执行,除非虚拟机停止 } System.out.println("5");//执行
运行时异常处理流程:
1.出现了异常,则会在当前代码行创建一个异常对象。
2.跳过当前代码行后面的代码。
3.拿着这个异常对象在本方法内找catch括号中进行比对,看括号中是否能接收
4.接收成功,则执行catch中对应的代码执行完毕,并执行try-catch体系下面的代码
5.接收不成功,默认把异常往上抛出,直到有方法内有对应的Try catch能处理
5.一直处理不成功抛到JVM处理异常
编译时异常:
编译时异常会在编译时期就报错,异常必须处理,不会默认往上抛出,需要手动通过throws向上抛出
jvm默认处理方案
(1)把异常的名称,异常原因及异常出现的位置输出在了控制台
(2)程序停止执行,下面的代码不会再执行了
2.抛出异常 throw, throws,让方法调用者去处理
throws写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常。
编译时异常必须要用throws声明,如果当前处理者不想或无法处理当前问题,可以使用throws继续向上抛出,直至被调用者或系统JVM处理。
throw写在方法内,结束方法,手动向上抛出异常对象,交给调用者,方法中下面的代码不再执行
解疑:
1.当出现多个异常,可以用多个catch捕获,对比顺序依上至下,因此父类需要写在子类异常下面,JDK7之后可以使用符号进行catch中异常对象合并
异常中的常见方法
自定义异常:为了让报错信息更见名知意
public class NameFormatExpection extends RuntimeExpection{ public NameFormatException{} public NameFormatException(String message){ super(message); } }
Try-Catch-Finally块的执行流程
FInally代码块是一定会执行的,我们来看看到底是在什么时候执行
public static int test(){
try
{
System.out.println("try");
return 1;
}
catch (Exception e){
System.out.println("catch");
}
finally {
System.out.println("finally");
}
return 3;
}
可以看到,在try的return方法之前执行了finally块的方法。
public static int test(){
try
{
System.out.println("try");
return 1;
}
catch (Exception e){
System.out.println("catch");
}
finally {
System.out.println("finally");
return 3;
}
}
public static int test(){
try
{
System.out.println("try");
throw new RuntimeException();
}
catch (Exception e){
System.out.println("catch");
return 1;
}
finally {
System.out.println("finally");
return 3;
}
}
综上,不管在try块还是catch块中碰到了return语句。都会在执行return语句之前去访问finally块代码