异 常:★★★★
异常:就是不正常。程序在运行时出现的不正常状况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。由于问题的产生有产生的缘由、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操做问题以及处理问题。java
出现的问题有不少种,好比角标越界,空指针等都是。就对这些问题进行分类。并且这些问题都有共性内容好比:每个问题都有名称,同时还有问题描述的信息,问题出现的位置,因此能够不断的向上抽取。造成了异常体系。数组
--------java.lang.Throwable:
Throwable:可抛出的。
|--Error:错误,通常状况下,不编写针对性的代码进行处理,一般是jvm发生的,须要对程序进行修正。
|--Exception:异常,能够有针对性的处理方式jvm
不管是错误仍是异常,它们都有具体的子类体现每个问题,它们的子类都有一个共性,就是都以父类名才做为子类的后缀名。函数
这个体系中的全部类和对象都具有一个独有的特色;就是可抛性。指针
class ExceptionDemo{
public static void main(String[] args) {
//byte[] buf = new byte[10241024700];//java.lang.OutOfMemoryError内存溢出错误
}对象
在开发时,若是定义功能时,发现该功能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就能够在使用这个功能的时候,预先给出处理方式。继承
如何标示呢?经过throws关键字完成,格式:throws 异常类名,异常类名...
这样标示后,调用者,在使用该功能时,就必需要处理,不然编译失败。接口
处理方式有两种:一、捕捉;二、抛出。
对于捕捉:java有针对性的语句块进行处理。
try {
须要被检测的代码;
}
catch(异常类 变量名){
异常处理代码;
}
fianlly{
必定会执行的代码;内存
catch (Exception e) { //e用于接收try检测到的异常对象。
System.out.println("message:"+e.getMessage());//获取的是异常的信息。
System.out.println("toString:"+e.toString());//获取的是异常的名字+异常的信息。
e.printStackTrace();//打印异常在堆栈中信息;异常名称+异常信息+异常的位置。资源
异常处理原则:功能抛出几个异常,功能调用若是进行try处理,须要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。
特殊状况:try对应多个catch时,若是有父类的catch语句块,必定要放在下面。
throw 和throws关键字的区别:
throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
throws用于抛出异常类,后面跟的异常类名,能够跟多个,用逗号隔开。throws用在函数上。
一般状况:函数内容若是有throw,抛出异常对象,并无进行处理,那么函数上必定要声明,不然编译失败。可是也有特殊状况。
异常分两种:
1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。
2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。
编译时被检查的异常和运行时异常的区别:
编译被检查的异常在函数内被抛出,函数必需要声明,否编译失败。
声明的缘由:是须要调用者对该异常进行处理。
运行时异常若是在函数内被抛出,在函数上不须要声明。
不声明的缘由:不须要调用者处理,运行时异常发生,已经没法再让程序继续运行,因此,不让调用处理的,直接让程序中止,由调用者对代码进行修正。
定义异常处理时,何时定义try,何时定义throws呢?
功能内部若是出现异常,若是内部能够处理,就用try;
若是功能内部处理不了,就必须声明出来,让调用者处理。
自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就须要咱们按照java异常创建思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
对于除法运算,0做为除数是不能够的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在咱们项目中,除数除了不能够为0外,还不能够为负数。但是负数的部分java并无针对描述。因此咱们就须要自定义这个异常。
自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具有可抛性。
2:经过throw 或者throws进行操做。
异常的转换思想:当出现的异常是调用者处理不了的,就须要将此异常转换为一个调用者能够处理的异常抛出。
try catch finally的几种结合方式:
1,
try
catch
finally
这种状况,若是出现异常,并不处理,可是资源必定关闭,因此try finally集合只为关闭资源。
记住:finally颇有用,主要用户关闭资源。不管是否发生异常,资源都必须进行关闭。
System.exit(0); //退出jvm,只有这种状况finally不执行。
当异常出现后,在子父类进行覆盖时,有了一些新的特色:
1:当子类覆盖父类的方法时,若是父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其余异常。
2:若是父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
注意:
若是父类或者接口中的方法没有抛出过异常,那么子类是不能够抛出异常的,若是子类的覆盖的方法中出现了异常,只能try不能throws。
若是这个异常子类没法处理,已经影响了子类方法的具体运算,这时能够在子类方法中,经过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不须要throws声明的。
常见异常:一、脚标越界异常(IndexOutOfBoundsException)包括数组、字符串;空指针异常(NullPointerException)二、类型转换异常:ClassCastException三、没有这个元素异常:NullPointerException四、不支持操做异常;异常要尽可能避免,若是避免不了,须要预先给出处理方式。好比家庭备药,好比灭火器。