异常

    1 异常的分类

        java中所有异常都从“Throwable”类中继承,一般从Exception类中派生出来。

        异常分为两个部分:一部分是错误(error),只能终止程序,程序本身不可处理;

                                      一部分是异常(Exception),程序本身可处理,异常类有两个主要的子类:

                                      IOException 类和 RuntimeException 类。。

      通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。

      1.1可查异常(编译器要求必须处置的异常)

       正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

      1.2 不可查异常(编译器不要求强制处置的异常)

       包括运行时异常(RuntimeException与其子类)和错误(Error)。

       Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

      1.3 运行时异常

   都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。                             运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

       常见的运行时异常:

ArithmeticException——由于除数为0引起的异常; 

ArrayStoreException——由于数组存储空间不够引起的异常; 

ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类 创建的,也不是其子类创建的,则会引起异常; 

IllegalMonitorStateException——监控器状态出错引起的异常; 

NegativeArraySizeException—一数组长度是负数,则产生异常; 

NullPointerException—一程序试图访问一个空的数组中的元素或访问空的对象中的 方法或变量时产生异常; 

OutofMemoryException——用new语句创建对象时,如系统无法为其分配内存空 间则产生异常; 

SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常; 

IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常; 

IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常; 

ClassNotFoundException——未找到指定名字的类或接口引起异常; 

CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常; 

InterruptedException—一当一个线程处于等待状态时,另一个线程中断此线程,从 而引起异常,有关线程的内容,将在下一章讲述; 

NoSuchMethodException一所调用的方法未找到,引起异常; 

Illega1AccessExcePtion—一试图访问一个非public方法; 

StringIndexOutOfBoundsException——访问字符串序号越界,引起异常; 

ArrayIdexOutOfBoundsException—一访问数组元素下标越界,引起异常; 

NumberFormatException——字符的UTF代码数据格式有错引起异常; 

IllegalThreadException—一线程调用某个方法而所处状态不适当,引起异常; 

FileNotFoundException——未找到指定文件引起异常; 

EOFException——未完成输入操作即遇文件结束引起异常。

      1.4 非运行时异常 (编译异常)

       是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

2 异常的声明(抛出)

       异常的声明是告诉java编译器有一个异常出现了,在方法中,异常声明在方法体的头部,利用关键字“throws” 来表示此方法在运行时的时候,很可能出现异常现象。

         声明模板:

         方法名 throws Exception {

                    方法体

                       }

          例子:public void test()throws Exception{

                            System.out.println("这是一个异常的声明");

                              }

3 异常的捕获

        异常的捕获通过try 和catch语句来实现,当一个一场被抛出到异常处理器中之后,通过try/catch语句进行捕获和处理,try/catch代码块中的代码称为保护代码,语法结构如下:

        try {可能会出现异常的程序段}

       catch(Exception e){ 处理方式} 

       Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

       3.1 多重捕获块

一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。

多重捕获块的语法如下所示:

try{

   // 程序代码

}catch(异常类型1 异常的变量名1){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}

上面的代码段包含了 3 个 catch块。

可以在 try 语句后面添加任意数量的 catch 块。

如果保护代码中发生异常,异常被抛给第一个 catch 块。

如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。

如果不匹配,它会被传递给第二个 catch 块。

如此,直到异常被捕获或者通过所有的 catch 块

3.2 finally关键字

finally 关键字用来创建在 try 代码块后面执行的代码块。

无论是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

finally 代码块出现在 catch 代码块最后,语法如下:

try{

  // 程序代码

}catch(异常类型1 异常的变量名1){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}finally{

  // 程序代码

}

       3.3 注意事项

1) catch 不能独立于 try 存在。

2) 在 try/catch 后面添加 finally 块并非强制性要求的。

3) try 代码后不能既没 catch 块也没 finally 块(catch和finally都不是必需的,但得存在其中一个)。

4) try, catch, finally 块之间不能添加任何代码

     4 自定义异常

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
可以像下面这样定义自己的异常类:

class MyException extends Exception{

方法体。

}
只继承Exception 类来创建的异常类是检查性异常类。
下面的 InsufficientFundsException 类是用户定义的异常类,它继承自 Exception。
一个异常类和其它任何类一样,包含有变量和方法。

     5 通用异常

         在Java中定义了两种类型的异常和错误。

5.1 JVM(Java虚拟机) 异常

由JVM抛出的异常或错误。例如:NullPointerException 类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。

5.2 程序级异常

由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,IllegalStateException 类。

      异常实例参考











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值