Offer来了:Java面试核心知识点精讲(原理篇)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 异常分类及处理

我们在开发过程中难免会遇到各种各样的异常,如何处理异常直接影响到程序或系统的稳定性,有时在线上仅仅忘记处理一个空指针异常都有可能引起整个运行中的应用程序的崩溃,因此具备全面的异常处理处理知识和良好的异常处理习惯对于开发人员来说至关重要。

2.2.1 异常的概念

异常指在方法不能按照正常方式完成时,可以通过抛出异常的方式退出该方法,在异常中封装了方法执行过程中的错误信息及原因,调用方在获取该异常后可根据业务的情况选择处理该异常或者继续抛出该异常。

在方法在执行过程中出现异常时,Java异常处理机制会将代码的执行权交给异常处理器,异常处理器根据在系统中定义的异常处理规则执行不同的异常处理逻辑(抛出异常或捕捉并处理异常)。

2.2.2 异常分类

在Java中,Throwable是所有错误或异常的父类,Throwable又可分为Error和Exception,常见的Error有AWTError、ThreadDeath, Exception又可分为RuntimeException和CheckedException,如图2-6所示。

图2-6

Error指Java程序运行错误,如果程序在启动时出现Error,则启动失败;如果程序在运行过程中出现Error,则系统将退出进程。出现Error通常是因为系统的内部错误或资源耗尽,Error不能被在运行过程中被动态处理。如果程序出现Error,则系统能做的工作也只能有记录错误的成因和安全终止。

Exception指Java程序运行异常,即运行中的程序发生了人们不期望发生的事件,可以被Java异常处理机制处理。Exception也是程序开发中异常处理的核心,可分为RuntimeException(运行时异常)和CheckedException(检查异常),如图2-7所示。

图2-7

◎ RuntimeException:指在Java虚拟机正常运行期间抛出的异常,RuntimeException可以被捕获并处理,如果出现RuntimeException,那么一定是程序发生错误导致的。我们通常需要抛出该异常或者捕获并处理该异常。常见的RuntimeException有NullPointerException、ClassCastException、ArrayIndexOutOf BundsException等。

◎ CheckedException:指在编译阶段Java编译器会检查CheckedException异常并强制程序捕获和处理此类异常,即要求程序在可能出现异常的地方通过try catch语句块捕获并处理异常。常见的CheckedException有由于I/O错误导致的IOException、SQLException、ClassNotFoundException等。该类异常一般由于打开错误的文件、SQL语法错误、类不存在等引起。

2.2.3 异常处理方式:抛出异常、使用try catch捕获并处理异常

异常处理方式有抛出异常和使用try catch语句块捕获并处理异常这两种方式。

(1)抛出异常:遇到异常时不进行具体处理,而是将异常抛给调用者,由调用者根据情况处理。有可能是直接捕获并处理,也有可能是继续向上层抛出异常。抛出异常有三种形式:throws、throw、系统自动抛出异常。其中,throws作用在方法上,用于定义方法可能抛出的异常;throw作用在方法内,表示明确抛出一个异常。具体的使用方法如下:

public  static  void  main(String[]  args)  {
      String  str  =  "hello  offer";
      int  index  =  10;
      if  (index  >=  str.length())
      {
          //1:使用throw在方法内抛出异常
          throw  new  StringIndexOutOfBoundsException();
      }else  {
          str.substring(0, index);
      }
}
//2:使用throws在方法上抛出异常
int  div(int  a, int  b)  throws  Exception{return  a/b; }

以上代码首先验证字符串的长度,如果长度不够,则通过throw关键字在方法内抛出一个StringIndexOutOfBoundsException异常,同时定义了一个div方法,使用throws关键字在该方法上定义一个异常。

(2)使用try catch捕获并处理异常:使用try catch捕获异常能够有针对性地处理每种可能出现的异常,并在捕获到异常后根据不同的情况做不同的处理。其使用过程比较简单:用try catch语句块将可能出现异常的代码包起来即可。具体的使用方法如下:

try  {
    //具体的业务逻辑实现
  }catch  (Exception  e){
  //捕获异常并处理
}

throw和throws的区别如下。

◎ 位置不同:throws作用在方法上,后面跟着的是异常的类;而throw作用在方法内,后面跟着的是异常的对象。

◎ 功能不同:throws用来声明方法在运行过程中可能出现的异常,以便调用者根据不同的异常类型预先定义不同的处理方式;throw用来抛出封装了异常信息的对象,程序在执行到throw时后续的代码将不再执行,而是跳转到调用者,并将异常信息抛给调用者。也就是说,throw后面的语句块将无法被执行(finally语句块除外)。