——- android培训、java培训、期待与您交流! ———-
1、异常:是在运行时期发生的不正常情况。
在java中用类的形式对不正常情况进行了描述和封装对象。描述不正常的情况的类,就称为异常类。其实就是程序中出现的问题。
2、Throwable:可抛出的。(这个体系中的所有类和对象都具备一个独有的特点:就是可抛性。可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。)
|–Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。
|–Exception:异常,可以有针对性的处理方式
注:error和exception 的区别是什么?
分析:error属于编译时错误,根本不会编译通过,也就是不会生成.class文件,想要恢复很困难。我们处理不了。
exception属于运行时错误,只有在调用的时候才会报错,比如空指针或数组下标越界等等。这种异常我们可以进行处理。
throws和throw的区别是什么?
分析:throws用于标识函数暴露出的异常类,并且可以抛出多个,用逗号分隔。throw用于抛出异常对象。
thorws用在函数上,后面跟异常类名。throw用在函数内,后面跟异常对象。
3、异常的处理格式:
注:对多异常处理时应注意的两点:
1) 声明异常时,建议声明更为具体的异常,这样处理的可以更具体。
2) 声明几个异常,就要有几个catch块。如果多个catch块中的异常出现继承关系,父类异常的catch块放在最下面。
4、Throwable中的方法:
1)getMessage():获取异常信息,返回字符串。
2) toString():获取异常类名和异常信息,返回字符串。
3) printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void。
4)printStackTrace(PrintStreams):通常用该方法将异常内容保存在日志文件中,以便查阅。
5、当函数内容有throw抛出异常对象时,如果并未进行try处理,必须要在函数上声明,否则编译失败。(注:RuntimeException除外。也就是说,如果函数抛出RuntimeException异常时,函数上可以不用声明。)如果函数声明了异常,调用者需要进行处理,处理方法可以抛(throws)可以try.
注:什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
6、常见的异常有哪些?
1)脚标越界异常(IndexOutOfBoundsException);
2)空指针异常(NullPointerException)
3)类型转换异常:ClassCastException
4)空指针异常:NullPointerException
等等。。。
7、异常分两种:
1)编译时被检测异常,只要是Exception及其子类都是编译时被检测的异常。
2)运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。
8、finally中定义的通常是关闭资源代码。因为资源必须释放。Finally只有一种情况下不会被执行,当执行到System.exit(0);语句时,finally不会执行。
9、自定义异常(当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。)
步骤:
1)定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2)通过throw 或者throws进行操作。
10、当异常出现后,在子父类进行覆盖时,有了一些新的特点:
1)当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2)如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
注意:
如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。
11、我的总结:
1)处理异常的方式有两种,throws或者try
2)调用到抛出异常的功能时,抛出几个就处理几个,一个try可以对应多个catch,多个catch,父类的catch要放在最下面。
3)RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明。
4)子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
5)如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try不能抛。
——- android培训、java培训、期待与您交流! ———-