Java异常机制关键字总结,及throws 和 throw 的区别

在Java的异常机制中,时常出现五个关键字:try , catch , throw , throws , finally。

下面将总结各个关键字的用法,以及throw和throws的区别:

(1) try : 该语句需要用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个Exception。Java 要求try语句后面至少需要有一个catch或者finally 块。

  在Java 7 中,Java开发人员对try语句进行了增强,使它可以支持对资源的自动回收管理,保证资源总是被正确的释放。具体使用会在后续的博文中分析。

(2) catch : catch语句的参数类似于方法的声明,包括一个Exception类型和一个Exception对象。Exception类型必须为Throwable类的子类,它指明了catch语句所处理的Exception类型;Exception对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。例如:

try{
    //此处将抛出一个异常
    ObjectInputStream ois = new ObjectInputStream(
           new FileInputStream("file.bin"));
    Object o = ois.readObject();
}
//catch 块对上面抛出异常的处理。
catch(IOException ioe){
    ioe.printStackTrace();
}      

   

注意:① catch语句可以有多个,分别处理不同类的Exception。Java运行时系统从上到下分别对每个catch语句处理的Exception类型进行检测,直到找到类型相匹配的catch语句为止。

         类型匹配指catch到的Exception类型与抛出的Exception对象的类型一致或者是它的父类,因此,catch语句的排列顺序应该是从特殊到一般,否则编译器将会报错。例如:

try{
    //此处将抛出一个异常
    ObjectInputStream ois = new ObjectInputStream(
           new FileInputStream("file.bin"));
    Object o = ois.readObject();
}
//在这里IOException是Exception 的子类,所以这里没有报错。
catch(IOException ioe){
    ioe.printStackTrace();
}
//假如把这个catch块放到上一个catch块前,将会报错。
catch(Exception ex){
    ex.printStackTrace();
}

    用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类,程序设计中要根据具体的情况来选择catch语句的例外处理类型。

    虽然try块后面可以有多个catch块,但是最终只有一个catch块会被执行,绝不可能有多个catch块被执行。

(3) throw and throws : 这两个语句对初学者来说(特别是使用IDE的初学者)来说,很容易混淆。两者区别如下:

  throw:总是出现在函数体中,指程序运行中抛出的一个具体的异常Exception,抛出的Exception需要用户来捕获处理。

  throws:总是出现在一个函数头中,用来声明一个方法可能抛出的所有异常信息。通常不用显示地捕获异常,系统将自动将异常抛给上级方法。

  简单来说:通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。

  

(4) finally : finally块代表总是会执行的代码块。无论try所指定的程序块中抛不抛出 Exception,也无论catch语句的是否有匹配try块抛出的异常类型,finally所指定的代码都要被执行,它提供了统一的出口。因此通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。当然,在遇到某些情况下,finally块就不会运行。具体请查看我的另一篇博文。
   
   
     

原文地址:https://www.cnblogs.com/scutwang/p/3596762.html