异常是运行时出现的错误,而非编译时出现的错误
开发程序遇到的问题都是异常
异常分为检查性异常和非检查性异常,作为java开发者,1-2年所遇到的差不多都为非检查性异常(RunTimeException),这些异常由JVM自动处理,而检查性异常由异常机制处理(自己处理)
在可能出现异常的一段代码中,写上try(),表示将可能出现的异常的段代码用异常机制包围起来,而且只能在方法里写,不能写在类中,catch表示捕获异常,故在小括号内写Exception e,捕获异常时幼稚,代码块值执行,此代码块中只有形参e,捕获到异常时自动执行,一旦捕获异常,异常所在语句下不再执行
一旦出现异常 catch语句块体内对当前工作进行保存,保护数据不被丢失
捕获异常顺序,先捕获小异常,在捕获异常,直译为先执行子类异常,再执行父类异常
例子如下
public class Test3 {
public static void main(String[] args) {
//Scanner s=new Scanner(System.in);
String a="hello";
try
{
for(int i=0;i<a.length()+2;i++)
{
System.out.println(a.charAt(i));
}
}
catch(IndexOutOfBoundsException e)//子类异常
{
System.out.println(e.getMessage());//返回一个异常消息字符串
}
catch(Exception e)//父类异常
{
e.printStackTrace();//输出异常堆栈中的异常信息
}
}
}
try和catch之间不能添加任何代码
finnally是为了关闭系统资源(包括文件访问资源,数据库资源)
解释
有一天举行中秋节晚会,老师买了很多糖果和瓜子等,小朋友用气球把房子布置的很漂亮,晚会过后,小朋友都走了,剩下了很多气球,瓜子皮,果屑..其中,房子就相当JVM虚拟机,小朋友就是可以回收的对象,但是有很多资源例如瓜子皮,果屑无法回收,这些就是文件访问资源或者数据库访问资源,最后都要带走,怎么带走呢,老师让小朋友打扫一下,就相当于jvm中资源的回收,所以为了避免异常,都要在finally中实现所有有很多方法xxx.close();
当try或catch代码块执行了Sytem.exit(0)时,finnally代码块不能执行,因为jvm被关闭
try catch什么时候使用,遇到try,catch和throw到底使用哪一个???
throws 声明抛出异常,其所在方法,方法复杂,可能会产生错误,返回异常,通过异常进行反馈,如果成功则不报错,失败则把错误抛给调用者,如果在主方法内调用者没对异常进行处理则抛给jVM,让JVM自动处理
这是一个消极处理,回避异常
throws关键字后可跟多个异常,先写子类异常,再写父类异常,中间用逗号分隔。。。
throw立刻抛出异常,不能单独使用,要么和try catch使用要么和 throws一起使用
throw可以用在方法体的任何位置,抛出异常后面的语句都不能执行
throw通常和自定义异常同时使用
自定义异常继承Exception,自定义异常类对父类构造方法进行重载
实现自定义异常由两步
1.继承Exception类
2.重载字符串参数构造方法,由super("")形成,将字符串信息传递给父类,由父类将字符串信息构造成自定义异常的错误消息