Java语言学习(8)-Java中的异常处理

1        Java中的异常处理

一、异常类说明

java中的异常包含如下几类:

  1)       检查类异常:这类异常是程序的用户错误或问题引起的,这些是开发人员是无法预见的。例如:打开一个不存在的文件。

  2)       运行时异常:运行时异常,是可能被程序开发人员避免的异常。

  3)       错误:错误不是异常,而是脱离程序开发人员控制的问题。例如:当栈溢出,一个错误就发生,错误在编译时是检查不到的。

 

java中异常类:

  Java的异常类都在java.lang包中。java中所有的异常,都是从java.lang.Exception中继承的子类。类的继承关系如下:

 

 

 

 

  Throwalbe继承出Exception和Error两个子类。Error类在Java程序中通常不捕获,因为Error一般发生在严重故障时,java程序本身处理不了。

 

Java内置了很多基础操作异常类:

  1、Java内置的检查类异常:

    1)       ClassNotFoundException:应用程序加载类时,找不到类定义,抛出此异常。

    2)       CloneNotSupportedException:当调用对象的Clone方法克隆对象时,发现该对象无法实现Cloneable接口,抛出此异常。

    3)       lllegalAccessException:拒绝访问一个类时,抛出此异常

    4)       InstantiationException:当试图使用类中的newInstance方法创建类的一个实例,而该类是一个接口、或一个抽象类无法实例化时,抛出此异常。

    5)       InterruptedException:一个线程被另一个线程中断,抛出此异常

    6)       NoSuchFieldException:请求的变量不存在,抛出此异常

    7)       NoSuchMethodException:请求的方法不存在时,抛出此异常

  2、Java内置的非检查类异常(运行时异常):

    1)       ArithmeticException:当出现异常的运算条件时,抛出此异常。如除0

    2)       ArrayIndexOutofBoundsException:当采用非法索引访问数据组时,抛出此异常。

    3)       ArrayStoreException:试图将一个错误类型的对象存储入数组时,抛出此异常。

    4)       ClassCastException:试图将对象转换为不是实例的子类时,抛出此异常

    5)       lllegalArgumentException:向方法传递不合适、或不正确的参数时,抛出此异常

    6)       lllegalMonitorStateException:一个线程试图等待一个对象的监视器、或试图通知其他正在等待此对象的监视器,但是此线程本身没有指定监视器。

    7)       lllegalThreadStateException:线程没有处于求情操作所需要的状态时,抛出此异常。

    8)       IndexOutofBoundsEception:排序索引(数字、字符串、向量等的排序)超出范围时,抛出此异常

    9)       NegativeArraySizeException:程序试图创建大小为负的数组时,抛出此异常

    10)    NullPointerException:试图访问的对象为Null时,抛出此异常

    11)    NumberFormatException:试图把字符串转换为数字类型,但该字符不能转换时,抛出此异常。

    12)    SecurityException:由安全管理器抛出的异常,标识安全侵犯

    13)    StringIndexOutofBoundsException:指示的字符串索引为负数、或超出字符串大小时,抛出此异常。

    14)    UnsupportedOperationException:当不支持的请求操作时,抛出此异常。

 

异常类的方法,如下为Throwable类的方法:

  1)       public String getMessage() 返回关于异常的详细信息

  2)       public Throwable getCause() 返回代表异常的原因

  3)       public String toString() 使用getMessage的结果返回类的字符串级名字

  4)       public void printStackTrace() 打印toString的结果和栈层次的System.err

  5)       public StackTraceElement[] getStackTrace() 返回一个包含堆栈层次的数组

  6)       public Throwable fillnStackTrace() 用当前的调用栈层次填充Throwable 对象栈层次

 

二、如何使用异常类

1、java中捕获异常的语法:

  try {

  }

  catch(异常类名字) {

  }

  catch(异常类名字) {

  }

  finally {

  }

  1)     try块内的代码称之为保护代码,保护代码异常时,可抛出异常。可能是系统内置的异常、或用户自定义的异常。

  2)     catch块捕获异常。一个try可以有多个catch。异常会逐个和catch中的异常名字对比,找到匹配的,执行catch后的代码块。

  3)     finally用于指定不论是否发生异常,都会被执行的代码块。一般用于清理类等收尾善后工作。

  4)     一个try语句不能既无catch、也无finally。finally可有可无,非强制性。

 

2、java中抛出一个异常的语法

  抛出异常的关键字:throws  throw

  以函数自定义抛出一个RemoteException异常为例:

    public class ClassName {

      ……

      public void funcTest(Integer i) throws RemoteException {

        .....

        if(.....) {

                    throw new RemoteException();

                  }

           }

    }

         一个方法可以抛出多个异常,中间用逗号隔开:

               public void funcTest(Integer i) throws RemoteException, InsufficientFundsException

        异常本质上,也是一个类。也需要定义,抛出时也需要new创建。

 

三、自定义异常类

1、定义异常类:

              public class AException extends Exception

              {

                     private double amount;

                     publice void AException(doubule amount) {

                            //也需要定义异常类的构造方法,new抛出异常时会调用

                            this.amount = amount;

                     }

 

                     public double getAmount() { //定义异常类的其他方法

                            return this.amount;

                     }

              }

 

2、使用自定义异常:

  函数执行时,抛出异常

              public class MyClasss {

                     double a;

                     double b;

                     ......

                     public void afunc() throws AException {    

                            ......

                            if(a < b) {

                                   throw new AException(b-a);  //创建异常,抛出

                            }

                            ......

                     }

              }

 

3、捕获自定义异常

                     public class BankDemo {    //主类定义

        .....

                            public static void main(String[] args) {  //main函数

                                   .....

                                   .....

                                   try{

                                          MyClasss c = new MyClasss();

                                          c.aFunc();     //含抛出自定义异常的编码块

                                   }

                                   catch(AExcption) {        //捕获自定义异常

                                          System.out.println("get AException")

                                   }

                            }

                     }

posted @ 2019-11-11 18:45  小拙  阅读(496)  评论(0)    收藏  举报