try...catch..finally

try..catch..finally

 

try{


代码块1


}catch(Exception e){


代码块2


}finally{


 代码块3


catch是抓取代码块1中的异常

代码块2是出异常后的处理
代码块3是不管出不出异常都会执行,如果代1或代2中有return,代3会在finally块的语句在try或catch中的return语句执行之后-返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。

图:

理解:

1)Java程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。
 
2)当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。
 
3)如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
 
4)对于RuntimeException,通常不需要我们去捕获,这类异常由Java运行系统自动抛出并自动处理。
 
5)派生类构造方法的异常说明必须包含基类构造方法的异常说明,即派生类构造方法的异常必须为基类异常或其父类,当基类构造方法没有异常时,派生类构造方法也可以异常声明。注意,派生类构造器不能捕获基类构造方法抛出的异常。
 
6)派生类方法可以不抛出异常,即使基类有异常说明,如果派生类方法有异常说明,必须是基类异常或其子类,而且当基类没有异常声明时,派生类方法不允许异常声明(关于构造方法见5中的说明)。
 
7)我们可以在方法声明时,声明一个不会抛出的异常,Java编译器就会强迫方法的使用者对异常进行处理。这种方式通常应用于abstract class和interface中。
 
Java标准异常
Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两种类型(指从Throwable继承而得到的类型):Error用来表示编译时和系统错误;Exception是可以被抛出的基本类型、在Java类库、用户方法以及运行时故障都可能抛出Exception异常。
Java异常类的结构:
  Throwable
   |____Error
   |____Exception
         |____RuntimeException
         |____其它Exception
  Error:Java运行系统中的内部错误以及资源耗尽的情况。
  Exception:RuntimeException及其子类(编程导致的异常)、其它Exception类。
 
关于RuntimeException
RuntimeException(或任何从它继承的异常),对于这种异常类型,编译器不需要异常说明。注意,只能在代码中忽略RuntimeException(及其子类)类型的异常,其他类型异常的处理都是由编译器强制实施的。
 
关于finally
对于一些代码,可能会希望无论try块中的异常是否抛出,它们都能得到执行。为了达到这一效果,可以在异常处理程序后面加上finally子句。
例如:
 
方法{
  try{
  ……..
  return;//加此条语句
  }
  catch(Exception e){
  }
  finally{
  ……….//会执行
  }
  ……….//不会执行
 
}

------------------------------------------------------------------------------------------------------------------------------------------------------

方法{
  try{
  ……..
  System.exit(-1);//终止运行
  }
  catch(Exception e){
  }
  finally{
  ……….//不会执行
  }
  ……….//不会执行
 
}
原文地址:https://www.cnblogs.com/qq1871707128/p/6075289.html