Java中的异常

来源:互联网 发布:mysql keepalived 编辑:程序博客网 时间:2024/06/15 11:00

异常和错误的概念

java中的所有的异常和错误都是Throwable类的子类。异常在java中的父类是Exception,错误在java中的父类是Error。

异常即不正常的事件,异常是指程序运行的过程中,发生某些意外的事情,比如,10除以0, 文件不存在等。通过程序处理,程序还可以继续运行下去。

java的错误一般是系统错误,一般不需要开发人员处理,也比较难处理,比如内存溢出等等,错误是无法控制的,程序肯定要中断。

异常的分类

异常可以分为运行期异常(RuntimeException)和编译期异常(CheckException)。
  运行期异常:程序运行时抛出的异常,所有RuntimeException的子类都是运行期异常。编译器不强制处理的异常,在运行期才处理的异常,往往编写过程中注意不到。
常见的运行期异常包括数学异常(ArithmeticException),空指针异常(NullPointerException),数组下标越界(ArraysIndexOutOfBoundsException),类转换异常(ClassCastException),... ...
  编译期异常:Exception的子类出去运行期异常都是编译期异常。编译器强制要求处理这类异常,如果不能捕获这类异常,程序将不能编译,而要捕获这类异常,在try块中必须显示抛出了这类异常。
常见的编译期异常包括IOException,SQLException,... ...


异常处理

try:检测不安全的块(发现异常)

catch:捕获异常,并做出处理。

finally:无论代码块出错与否,无论出现异常的块处理与否,该块一定会执行。


  try块中任何一条语句发生了异常,下面的代码将被终端,程序将跳转到异常处理代码块中,即catch块。catch语句必须紧跟着try语句之后,一个try后面可以写多个catch,分别捕获不同类型的异常,要先谢子类异常再写父类异常,否则会出现编译错误。

try{
   String demo = null;
   demo.split("a");
   System.out.println("try");
  }

catch(NullPointerException e){
   System.out.println("NullPointerException");
   e.printStackTrace();
  }

catch(RuntimeException e){
   System.out.println("RuntimeException");
   e.printStackTrace();
  }
   finally{
   System.out.println("Finally");
  }


finally与return

  在try中没有异常的情况下try、catch、finally的执行顺序 try --- finally ;

  如果try中有异常,执行顺序是try --- catch --- finally;
  如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally --- return;

  如果try中有异常并且try中有return这时候正常执行顺序是try----catch---finally--- return, 总之 finally 永远执行!


throw和throws

  throw和throws是异常抛出的两种形式。

  一般当程序出现某种逻辑错误时,会使用throw关键字抛出某种特定类型的异常,如 throw new NullPointerException 。

  当某个方法可能会抛出某种异常时,一般使用throws 声明可能抛出的异常,然后交给上层,上层使用try/catch方法处理或者继续用throws声明继续抛出异常。一个方法上可以抛出多个异常,用都好隔开,如publicvoid  function  throws NumberFormatException,NullPointerException{  

(方法体中可能出现NumberFormatException,NullPointerException这两种错误}


自定义异常

  自定义异常就是自己定义的异常类,也就是自己定义一个异常作为Exception直接或间接的子类。自定义异常类中往往不写其他方法,只重载需要使用的构造方法。
如:public  class CustomException  extends  RuntimeException{
public CustomException(String E){
super(E);
}
}
在程序中使用自定义异常大致可以分为一下几步
 1. 创建自定义异常类
 2. 在方法中通过throw 关键字抛出自定义异常
 3. 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字声明该异常
 4. 调用throws声明该异常的方法时,使用try  catch捕获自定义的异常类型,并在catch中进行处理

好的编程习惯:
1. 在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;
2. 用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();
3. 如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;
4. 如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。

原创粉丝点击