error:由系统底层发生,修改代码
exception:告诉jvm,jvm告诉使用者
举一个简单的例子
Int[] a=new Int[10];
System.out.println("a[10]");
输出语句发生问题时,jvm就将这个已知的问题封装成对象 throw new ArrayIndexOutOfBoundsException(1);将问题抛给调用者main函数,如果main函数没有针对的处理方法,main函数就继续抛给调用者jvm,jvm会终止程序,jvm就使用了默认的处理方法,将问题的名称+信息+位置在控制台上显示出来,让调用者看到
e.printStackTrace();名字+信息+位置 jvm默认的处理,收到异常就是调用这个方法,将信息显示到屏幕上。
异常的处理:
1.遇到问题不进行具体的处理,而是继续抛给调用者,其实就是在函数上通过throws关键字声明异常,告诉调用者。
2.针对性的处理方法,捕获。
try{
有可能异常的代码
}catch(异常变量){
捕获,处理异常的代码
}finally{
一定会被执行的代码
}
throw和throws有什么区别?
1.位置不同
throws用在函数上,后面跟着的是异常类,可以跟多个
throw用在函数内,后面跟的是一场对象
2.功能不同
throws用来声明异常,让调用者只知道该功能可能出现的问题,并由调用者给出预先的处理方法
throw抛出具体的问题对象,执行到throw,功能就已经结束了,就跳转到调用者,并将具体的问题对象也抛给调用者。也就是throw语句独立存在时,下面不要定义其他语句,执行不到。
3.执行时期不同
throws编译时期
throw运行时期
finally
finally块用于回收再try块里打开的物理资源,异常机制会保证finally总被执行
当catch中遇到return时。finally还是会被执行
除非在try块、catch块中使用了system.exit(0);退出ivm,只有这种情况下finally不会执行
尽量避免在finally块中使用return或throw等导致方法终止的语句,否则会出现一些很奇怪的现象
当程序在try,catch中一到return或throw语句(该语句都会导致方法立即结束),系统执行这两个语句并不会结束该方法,而是会去寻找该异常处理流程中是否包含finally块。
如果没有finally块,程序立即执行return或throw语句,方法终止。
如果有finally块,系统立即执行finally块,只有当finally块执行完成后,系统才会调回来执行try,catch块中的return或throw语句。如果finally有return或throw语句,finally已经终止了方法,系统不会再跳回去执行try,catch块中的任何代码
为了保证try语句可以自动关闭资源,这些资源实现类必须实现AutoCloseable或Closeable接口,实现这两个接口就必须实现close()方法
自动关闭资源的try语句相当于包含了隐式的finally块(这个finally块用于关闭资源),此时try语句中既没有catch也没有finally