黑马程序员——异常

来源:互联网 发布:遗传算法工具箱怎么用 编辑:程序博客网 时间:2024/06/05 15:38
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


异常

简介

在程序设计中,错误通常分为编译错误和运行错误。
编译错误是比较容易发生的,而运行错误常常让开发人员感到头疼。
异常就是一个运行错误,如果不能很好的处理异常,则项目的稳定性就不强。所以为了增强项目的稳健性,就要求在出现异常时进行处理,即异常处理

1 、error和exception

  Error类和Exception类都继承自Throwable类(是java语言中所有错误或异常的超类),是它的两个基本子类。
  Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,比如,内存资源不足等,对于这种错误,程序基本无能为力,程序员只能让程序终止,除了退出运行别无选择。
  Exception(异常)表示需要捕捉或者程序进行处理的异常,一般是因为编程错误或偶然的外在因素导致的一般性问题,比如,对负数开平方根、访问空指针等等,对于这种错误,有补救和控制的可能,程序员可以预先防范。


2 、异常分类

  
2.1   非受检异常(unchecked  exception)

是指编译器不要求强制处置的异常。一般是因为涉及或实现方式不当而导致的问题。
java.lang.ClassCastException:错误的类型转换异常
java.lang.ArrayIndexOutOfBoundsException:数组下标越界异常
java.lang.NullPointerException:空指针访问异常
java.lang.ArithmeticException:除零溢出异常


2.2   受检异常(checked  exception)

是指编译器要求必须处置的异常。由于外界因素造成的一般性异常。
 java.lang.ClassNotFoundException:没有找到具有指定名称的类异常
java.io.FileNotFoundException:访问不存在的文件异常
java.io.IOException:操作文件时发生的异常
java.sql.SQLException:操作数据库时发生的异常

 java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。


3、声明已检查异常

 (1)如果遇到无法处理的情况,那么java的方法可以抛出一个异常。
 (2)一个方法必须声明所有可能抛出的已检查异常。
 (3)对于那些可能被他人使用的java方法,应该根据异常规范(exception specification),在方法的首部声明这个方法可能抛出的异常。
          如果一个方法有可能抛出多个已检查异常,就必须在方法的首部列出所有的异常类。如下面例子所示:
           public Image loadImage(String s) throws EOFException, MalformedURLException
           { ... }
 (4)在java中,没有throws说明符的方法将不能抛出任何已检查异常。
 (5)如果在子类中覆盖了超类的一个方法,子类方法中声明的已检查异常不能超过超类方法中声明的范围。
           如果超类方法没有抛出任何已检查异常,子类也不能抛出任何已检查异常。
 (6)不应该声明java的内部错误,即从Error继承的错误。
            不应该声明从RuntimeException继承的那些未检查异常。


4、抛出异常

  (1)对于一个已经存在的异常类,将其抛出非常容易:
       ① 找到一个合适的异常类。
       ② 创建这个类的一个对象。
       ③ 将对象抛出。
  (2)一旦方法抛出了异常,这个方法就不可能返回到调用者。


5、创建异常类

   只需要定义一个派生于Exception的类,或者派生于Exception子类的类。
   习惯上,定义的异常类应该包含两个构造器:一个是默认构造器;另一个是带有详细描述信息的构造器。例如:
 
      class FileFormatException extends IOExcption        {                public FileFormatException(){}                public FileFormatException(String gripe)                {                        super(gripe);                }        }



6、捕获异常

  (1)如果某个异常发生的时候没有在任何地方进行捕获,那么程序就会终止执行,并在控制台上打印出异常信息。
  (2)如果调用了一个抛出已检查异常的方法,就必须对它进行处理,或者将它传递出去。
       通过,应该捕获那些知道如何处理的异常,而将那些不知道怎样处理的异常传递出去。如果想将异常传递出去,就必须在方法的首部添加一个throws说明符。
  (3)如果编写一个覆盖超类的方法,而这个方法又没有抛出异常,那么这个方法就必须捕获方法代码中出现的每一个已检查异常。
       不允许在子类的throws说明符中出现超过超类的方法所列出的异常类范围。


注:
 当try{}里有一个return语句的时候,finally{}中的代码也会在return之前执行。
       
0 0
原创粉丝点击