关于异常的简单理解

  首先,异常是什么?异常是在程序运行期间,出现了一个非法的运行状态。

  打开API文档,输入Exception,得到关于Exception类的信息如下:Exception类的父类是Throwable类,同时,对于Exception的解释是:Exception类及其子类是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件。

  根据java的规则,我们可以得到这样的信息:

   Throwable是所有异常及错误的“父亲”,其下分成系统错误Error和可捕获的异常Exception两类。系统错误Error是程序本身解决不了的错误,一般交由JVM处理,通常遇到这种错误时JVM会直接终止程序。而异常Exception是可以由程序捕获的错误,也就是说,程序可以捕获并抛出这一类的错误。

   而Exception之下又可以分成两种,一种是IOException异常及其派生异常,一般出现在读写数据流时,也叫作非运行异常,这类异常大多是必须要处理的异常,否则程序一般不能通过编译。另一种是RuntimeException异常及其子类异常,也叫作运行时异常,是在程序运行中出现的,出现原因一般是逻辑错误,通过throw可随时抛出此类异常。

1、try…catch…finally捕获并抛出异常

   具体程序语句如下:

try{
 //可能发生运行错误的代码
}
catch(异常类型 异常对象引用){
//用于处理异常的代码
}
finally{
//用于善后的代码
}

该语句是发现异常并处理异常的基本句式,其作用为:当try语句块中的代码执行时发现异常,程序的正常运行便中断,并抛出异常对象,然后在try块后面的各个catch()中找到与异常对象相匹配的类。当异常对象符合下面三个条件之一时,就认为这个异常对象与对应的异常类相匹配。

(1)异常对象所属的类与catch()中参数类相同。

(2)异常对象所属的类是catch()中参数类的子类。

(3)catch()中的参数类是一个接口时,发生的异常对象类实现了这一接口。

最后,执行完catch中的代码后,程序恢复运行,但不会再回到异常发生处继续执行,而是会执行try-catch之后的语句,即finally语句块。

2、throw和throws抛出异常

  throw可以直接人为抛出异常,有两种格式,如下:

    直接抛出异常类实例

throw new ExceptionType(...);
// ExceptionType是Throwable的子类

   先定义异常类对象并实例化,然后抛出

ExceptionType e = new ExceptionType(...);
throw e;

  而如果在方法中不人为抛出异常,则必须在定义该方法时使用throws子句抛出异常。

例:

public class TestThrows   {
        public static void main(String[] args)     {
            FileInputStream fis = new;                       
           FileInputStream("a.txt");
            }
    }

上段代码是错误的,应当在定义主方法时使用throws IOException。

所以,throws代码的格式如下:

修饰符 返回类型 方法名(参数列表)throws 异常类名列表{

    …//方法体中的语句

}

总结:

  try系列语句需要在尽量靠近异常的地方使用,否则时间复杂度会大大增加;尽量用具体的异常类型捕获并抛出异常,不要在代码中用catch(Exception)“吃掉”所有异常。

原文地址:https://www.cnblogs.com/YXSZ/p/9942296.html