异常数组
程序不正常的执行,报错。Exception类框架
异常有父类:Throwable,Throwable又有子类Error和Exception。this
异常的分类:spa
Throwable:为如下错误的父类。指针
Error:(错误通常比异常严重,通常为虚拟机出现错误),Error类型的错误必须抛出解决不能捕获!日志
Exception:对象
RuntimeException(运行时异常):编译经过,不强制处理,在程序运行时出现→ 不受检查异常。继承
算术异常、数组下标越界、空指针异常、递归
编译期异常(除了RuntimeException其他都是编译期异常):必须处理,要么捕获,要么抛出。通常是语法错误,在进行编译时就会报错→ 受检查异常.必须及时处理!内存
常见异常
Error:内存溢出错误(两个方法之间递归调用);
异常的处理
不论是错误Error仍是异常Exception都是须要被处理。处理异常有两种方式:
抛出throws 和捕获try catch
throws:用法:在方法声明后 即方法参数列表后,左大括号({)前用throws声明要抛出的异常。throws 异常类名,支持同时抛出多个异常,也就是 throws 异常类名1,[异常类名2]….若是方法有多个异常须要抛出,可使用最大异常父类声明(Exception)直接抛出Exception;
异常的注意事项以及如何使用异常处理:
有异常的方法怎么使用:
1)方法内部的异常有try catch处理时:该方法能够被正常调用。
2)方法声明上有异常抛出时(throws):调用该方法时必须对该方法处理。
若是方法声明上有异常抛出,重写时应该注意
子类重写有异常方法的时候,子类的方法抛出的异常范围要比父类范围小,要么范围相等、要么没有异常。
做用在于:声明该方法/编译或运行时可能抛出的异常种类。只要方法中有异常,不论是运行异常,仍是编译异常,程序就会在该处中止,并抛出异常。
注意事项:运行时异常,能够明确的在方法声明上声明要抛出的运行时异常,也能够不声明。编译期异常必须处理。要么抛出(throws)要么捕获(try catch)。
异常的本质:程序运行抛出的异常,实际上是方法声明的异常类的对象。
throw
在方法体中,能够明确显示抛出哪一种异常。能够准确地控制在什么地方抛除异常。
语法:throw 异常对象(匿名对象的形式 new 异常类名()),若是throw后面抛出的异常对象是运行时异常,那么能够在方法声明上声明要抛出的异常,也能够不声明。若是throw抛出的是编译期异常对象,必须强制处理该异常(声明抛出或者捕获)。
throw与throws异同
1)位置不一样:throw在方法体中,throws是在方法声明上。
2)做用不一样:throw后是声明抛除的异常对象,throws后声明的是异常类类名。
3)写法不一样:throw后只能写一个异常,throws后能够写多个对象名。
try catch
异常的另一种处理方式,叫作捕获异常,在上线的项目中运用普遍,由于显示抛出异常,程序就会在异常处中止,就会影响程序功能,可是捕获异常能够作到即便有异常可是程序还会继续执行。捕获异常后通常能够将异常作成异常日志,把捕获的异常统一记录,后续再进行修改。
Try catch能够捕获异常让程序正常执行,可是try{}中的代码,若是有异常的话,try中报错后的代码不执行,如图:
语法:
try{
可能出现异常的代码
}catch(要捕获的异常类名 对象名){
捕获以后干的事情。
}[catch(要捕获的异常类名2 对象名2){
捕获后干的事情。
}]
若是try中抛出的异常不是catct后面要捕获的异常,就会继续抛出异常,程序就会停下。
若是try中可能抛出多个异常,能够写多个catch 同时捕获多个异常.可是写多个catch麻烦,能够直接捕获最大的异常Exception。在捕获Exception异常后,就不能再写捕获其子类异常,由于上一个Exception异常已经基本捕获所有异常
publicstaticvoid main(String[] args) { try { //可能出现异常的代码 System.out.println(1/0); }catch(ArithmeticException ari){ System.out.println(ari); System.out.println(ari.getMessage());//打印异常信息/将异常信息写入日志 //打印错误信息 ari.printStackTrace(); //获取主要缘由,框架中会常常见Casuse, Cause在写项目的时候常常用到,报错会很是详细 Throwable Masg = ari.getCause(); System.out.println(Masg); }//finally{}最终都要执行到的,可写可不写 } |
自定义异常
1)建立自定义异常类
2)继承异常类(Exception、RuntimeException、Throwable(是最大的抛出异常类,其下面是Exception)继承哪一个将拥有那个的特性。例如继承RuntimeException及其子类就有运行时异常的特色。
3)写带(String)参数的构造方法用于将异常信息经过super(messags)传递给父类.
用throw抛出异常程序会直接中止,因此建议用try捕获异常,可是捕获异常的时候因为自定义异常中并无定义相似除数为0、下标越界等自动抛出异常的方法,因此须要捕获本身抛出的异常相似于:
在此set方法被调用的时候,会进行以下的异常捕捉 publicvoid setAge(intage) { if(age >150) { try { //若是年龄大于150,执行下面的一句话,必定会抛出异常 thrownew AgeGT150Exception(""); //捕获 AgeGt150Exception类的异常 }catch(AgeGT150Exception ag) { //捕获到后的操做 ag = new AgeGT150Exception("年级大于150"); System.out.println(ag); } }elseif(age < 0) { try { thrownew AgeLT0Exception(""); }catch(AgeLT0Exception ag) { ag = new AgeLT0Exception("年龄小于0"); System.out.println(ag); } }else { this.age = age; } }
//异常类 publicclassAgeGT150Exceptionextends RuntimeException{ public AgeGT150Exception(String massge) { super(massge); } } |