天天看点

Java异常分类总结及try...catch异常捕获处理

一、异常简介

Java中所有异常的根是Throwable类。该类有两个子类: Error和Exception。

1.Error类

  Error也称为错误,通常是由JVM错误或者系统奔溃等引起的,无法通过程序来解决,所以在程序中不需要主动捕捉处理。

2.Exception类

      Exception类又可以分为Checked异常和Runtime异常。checkedException异常在编译时期就可以知道是否会发生异常,如果不对这些异常进行抛出、捕获的话就无法通过编译。而RuntimeException,则是运行的时候出现的异常,无法在编译时期确定是否会发生,因此也称为Unchecked异常。Runtime异常是所有RuntimeException类及其子类的实例。

二、异常分类及处理方式

1.CheckedException

(1)CheckedException是必须解决的异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。常见的CheckedException有:

   java.lang.ClassNotFoundException 

   java.lang.NoSuchMetodException  

   java.io.IOException

(2)处理方式

    a.当前方法知道如何处理该异常,则用try...catch块来处理该异常。  

    b.当前方法不知道如何处理,则在定义该方法时使用throws声明抛出该异常。

2.RuntimeException

       在Java程序运行时,除数为0和数组下标越界等情况频繁发生,处理麻烦。如果显示声明或者捕获将会对程序的可读性和运行效率影响很大。所以此类异常通常是由系统自动检测并将它们交给缺省的异常处理程序。当然如果有处理需求也可以显示捕获地它们。常见的RuntimeException子类有:

  java.lang.ArithmeticException

  java.lang.ArrayStoreExcetpion

  java.lang.ClassCastException

  java.lang.IndexOutOfBoundsException

  java.lang.NullPointerException

三、try/catch捕获处理异常

      Java显示地捕获并处理异常是通过try/catch代码块实现的。通常把可能出现异常的代码放在try中。当抛出异常时系统会生成一个异常对象,通过catch查找捕获这个异常并进行处理,处理之后接着执行下面的程序。注意catch需要指定异常对象类型,且该类型在继承层次上必须能够包含待捕获的异常(异常本身或父类)。

try{
  int a = 5/0;
}catch(Exception e){
  System.out.println("除数不能为0");
}    
           

     此处catch中异常类型可以为Exception,因为它是算术运算异常ArithmeticException的父类。实际应用中,应尽量明确异常的具体类型,而不是笼统地使用Exception捕获,以方便异常的处理。

四、finally的使用

       在try...catch捕获处理程序异常时,通常会遇到异常导致资源无法释放的情况,这时候就需要在try...catch的基础上引入finally块。finally块在程序异常或正常的情况下,都会被执行。即无论try中的代码是否发生异常,finally中的代码都会执行。因此,finally块常用来释放系统资源。

     关于finally使用的更多细节请参考本人博客:Java异常处理之finally的使用总结

继续阅读