JAVA中的异常的捕获以及它的处理

异常是程序中的一些错误,但不是所有的错误都是异常。
所有的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
JAVA中的异常的捕获以及它的处理

  • 检查性异常(IOException):最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  • 运行时异常(RuntimeException): 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • 错误(Error): 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

异常的捕捉

使用try,catch和finally来捕捉异常。

try{
	//有可能出现异常的程序代码块
}catch(Exception e){
	//编写异常的处理语句
}catch(Exception e1){
	//编写异常的处理语句
}catch(Exception e2){
	//编写异常的处理语句
}finally{
	//一定会运行到的语句
}

异常处理过程:

  1. 一旦产生异常,则首先会产生一个异常类的实例化对象。
  2. 在try语句中对此异常对象进行捕捉
  3. 产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的代码

如果在try中产生了异常,则程序会自动跳转到catch语句中找到匹配的异常类型进行相应的处理。之后不管是否会产生异常,则肯定都会执行到finally语句,finally语句就作为异常的统一出口,但是finally不一定是被需要的,它是可以被省略的。

所以有以**意事项:

  • catch 不能独立于 try 存在。
  • 在 try/catch 后面添加 finally 块并非强制性要求的。
  • try 代码后不能既没 catch 块也没 finally 块。
  • try, catch, finally 块之间不能添加任何代码。

Throws和Throw关键字

  1. Throws关键字
    在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示次方法不处理异常,而是交给方法的调用处来处理,throws的使用格式如下:
public 返回值类型 方法名称(参数列表.....)throws 异常类{}

//例如
Class Math()
{
	public int div(int i,int j) throws Exception
	{
		int temp = i/j;
		return temp;
	}
}

在方法前使用了throws关键字之后,不管是否有异常,在调用此方法处都必须进行异常处理。
既然throws是在方法上定义的,那么主方法上当然也可以使用throws关键字,单主方法是程序的起点,所以主方法再向上抛异常的时候,只能将异常抛给JVM处理。

  1. Throw关键字

    与throws不同的是,我们可以直接使用throw关键字来抛出一个异常,抛出时直接抛 出异常类的实例化对象即可。
    在开发中,不产生异常肯定是最好的,那么为什么会有throw关键字呢?

    实际上JAVA中所有的异常也是使用throw抛出的,只不过这部分代码
    已经被JAVA隐藏起来了。虽然JAVA本身可以自己抛出异常,但很多时候用户定义了自己的异常类型,那么系统肯定是无法抛出的,这个时候只能够借助于throw抛出异常。

Exception类和RuntimeException类

RuntimeException是Exception的子类

  • Exception在程序中必须使用try…catch进行处理
  • RuntimeException可以不适用try…catch进行处理,但是如果有异常产生的话,则异常将由JVM处理,但是在开发代码的时候最好要使用try…catch,这样在程序出错后依然可以执行
  • Exception定义的异常时必须处理的,而RuntimeException处理的异常可以选择性的进行处理