--------- android培训、java培训、期待与您交流!----------
一、异常概述
1、异常:就是程序在运行时出现不正常的情况。
2、异常由来:问题也是现实生活中一个具体的事物,也可以通过Java的类的形式进行描述,并封装成对象。
3、其实就是Java对不正常情况进行描述后的对象体现。
二、对于问题的划分有两种:
1、严重的问题:Java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。
2、非严重的问题:Java通过Exception来进行描述。对于Exception可以使用针对性的处理方法进行处理。
3、无论Error还是Exception都具有一些共性内容:不正常情况的信息,引发原因等。
4、Error和Exception的父类Throwable。
三、异常优缺点:
1、优:让程序有更好的容错性,更加健壮。
2、缺:
①无法穷举所有的异常情况,因为异常情况往往比我们可以考虑到的情况多,所以程序总是不够健壮。
②错误处理代码和业务实现代码混杂。这种错误处理和业务实现混杂的代码严重影响程序的可读性,会增加程序维护的难度。
四、对于异常分两种
1、编译时被检测的异常
2、编译时不被检测的异常(运行时异常,RuntimeException以及其子类)
五、异常处理机制
1、使用try..catch捕获异常。
try { //需要被检测的代码 } catch (/*异常类 变量*/) { //处理异常的代码;(处理方式) } finally { //一定会执行的语,除非前面语名中有System.exit(0); //可用于回收资源。 }
六、访问异常信息
getMessage():返回该异常的详细描述字符串。
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流。
getStackTrace():返回该异常的跟踪栈信息。
其实jvm默认的异常处理机制,就是在调用printStackTrace方法,打印异常的堆栈的跟踪信息。
七、异常声明
使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理;如果最终main方法也不知道如何处理这种异常,也可以使用throws声明招聘异常,该异常将交给JVM处理。JVM对异常的处理方式是,打印异常的跟踪栈信息,并中止程序运行,这就是程序在遇到异常后自动结束的原因。
1、一旦使用throws语句声明抛出该异常,程序就无须使用try...catch块来捕获该异常了。
2、子类方法声明抛出的异常类型应该是父类声明抛出异常类型的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。
public class OverrideThrows { public void test()throws IOException { FileInputStream fis = new FileInputStream("a.txt"); } } class Sub extends OverrideThrows { // 子类方法声明抛出了比父类方法更大的异常 // 所以下面方法出错 public void test()throws Exception { } }
3、在函数上声明异常,便于提高安全性,让调用者进行处理,不处理则编译失败。
4、函数内如果抛出的是RuntimeException异常,函数上可以不用声明,编译一样通过。
八、多异常处理
1、记住:声明得具体些,处理得就更具体。
声明多个具体,就处理多个具体。
①声明异常时,建议声明更为具体的异常,这样处理的可以更具体。
②对方声明几个异常,就应对应有几个catch块,不要定义多余的catch块。
③如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
④如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。
⑤建议在进行catch处理时,catch中一定要定义具体处理方式。不要简单定义一句e.printStackTrace(),也不要简单就书写一条输出语句。
九、自定义异常
1、按照Java的面向对象的思想,将程序中出现的特有问题进行封装。
2、因为项目中会出现特有的问题,而这些问题java并未对其描述,那么这时,我们可以按照java对异常描述的思想自定义异常,将进行自定义的异常封装。
3、自定义异常必须是自定义类继承Exception。
原因:异常体系有一个特点:因为异常类和异常对象都被招聘,他们都具备可抛性,这个可抛性是Throwable这个体系中独有特点,只有这个体系中的类和对象才可以被throws和throw操作。
4、throws和throw的区别
①throws使用在函数上,throw使用在函数内。
②throws后面跟的是异常类,可以跟多个,用逗号隔开,throw后跟的是异常对象。
5、自定义异常时,如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException
class MyException extends Exception { private String msg; //无参构造器 MyException(){} //有参数构造器 MyException(String msg) { super(msg); } }
--------- android培训、java培训、期待与您交流!----------
本文出自 “汐朔” 博客,转载请与作者联系!