JAVA的异常处理

1.  Java 的异常处理

异常的处理主要包括捕获异常、程序流程的跳转和异常处理语句块的定义等。当一个异常被抛出时,应该有专门的语句来捕获这个被抛出的异常对象,这个过程被称为捕获异常。当一个异常类的对象被捕获后,用户程序就会发生流程的跳转,系统中止当前的流程而跳转至专门的异常处理语句块,或直接跳出当前程序和 Java 虚拟机,退回到操作系统。

 

2.  异常类说明

Java 中所有的异常都由类来表示。所有的异常都是从一个名为 Throwable 的类派生出来的。因此,当程序中发生一个异常时,就会生成一个异常类的某种类型的对象。 Throwable 类有两个直接子类: Exception 和 Error 。

    与 Error 类型的异常相关的错误发生在 Java 虚拟机中,而不是在程序中。错误类( Error )定义了被认为是不能恢复的严重错误条件。在大多数情况下,当遇到这样的错误时,建议让该程序中断。这样的异常超出了程序可控制的范围。

   由程序运行所导致的错误由 Exception 类来表示,该异常类定义了程序中可能遇到的轻微的错误条件。可以编写代码来处理这样的异常并继续执行程序,而不是让程序中断。它代表轻微的可以恢复的故障。接收到异常信号后,调用方法捕获抛出的异常,在可能的情况下再恢复回来,这样程序员可以通过处理程序来处理异常。

 

3.  异常的分类

     1.执行异常

执行异常即运行时异常,继承于 Runtime Exception 。 Java 编译器允许程序不对它们做出处理。下面列出了主要的运行时异常。

 

·     ArithmeticException : 一个非法算术运算产生的异常。

 

·     ArrayStoreException : 存入数组的内容数据类型不一致所产生的异常。

 

·     ArrayIndexOutOfBoundsException : 数组索引超出范围所产生的异常。

 

·     ClassCastException : 类对象强迫转换造成不当类对象所产生的异常。

 

·     IllegalArgumentException : 程序调用时,返回错误自变量的数据类型。

 

·     IllegalThreadStateException :线程在不合理状态下运行所产生的异常。

 

·     NumberFormatException : 字符串转换为数值所产生的异常。

 

·     IllegalMonitorStateException : 线程等候或通知对象时所产生的异常。

 

·     IndexOutOfBoundsException : 索引超出范围所产生的异常。

 

·     NegativeException : 数组建立负值索引所产生的异常。

 

·     NullPointerException : 对象引用参考值为 null所产生的异常。

 

·     SecurityException : 违反安全所产生的异常。

 

2.检查异常

除了执行异常外,其余的子类是属于检查异常类也称为非运行时异常,它们都在 java.lang 类库内定义。 Java 编译器要求程序必须捕获或者声明抛弃这种异常。下面列出了主要的检查异常。

 

·     ClassNotFoundException : 找不到类或接口所产生的异常。

 

·     CloneNotSupportedException :使用对象的 clone( )方法但无法执行 Cloneable所产生的异常。

 

·     IllegalAccessException : 类定义不明确所产生的异常。

 

·     InstantiationException : 使用 newInstance( )方法试图建立一个类 instance时所产生的异常。

 

·     InterruptedException : 目前线程等待执行,另一线程中断目前线程所产生的异常。

4.  错误的分类

        Error 类与异常一样,它们都是继承自 java.lang.Throwable 类。 Error 类对象由 Java 虚拟机生成并抛出。 Error 类包括 LinkageError (结合错误)与 VitualmanchineError (虚拟机错误)两种子类。

 

1. LinkageError

LinkageError 类的子类表示一个类信赖于另一个类,但是,在前一个类编译之后,后一个类的改变会与它不兼容。

 

LinkageError 类包括 ClassFormatError 、 ClassCircularityError 、 ExceptionInitializerError 、 NoClassDeFormatError 、 VeritfyError 、 UnsatisfidLinkError 和 IncompatibleClassChangeError 等子类。其中 NoIncompatibleClassChangeError 类又包含 AbstractMethodError 、 NoSuchField   Error 、 NoSuchMethodError 、 IllegalAccessError 和 InstantiationError 子类。这些类所代表的意义如下所述。

 

·     ClassFormatError : 类格式所产生的错误。

 

·     ClassCircularityError : 无限循环所产生的错误。

 

·     ExceptionInitializerError : 初始化所产生的错误。

 

·     NoClassDeFormatError : 没有类定义所产生的错误。

 

·     VeritfyError : 类文件某些数据不一致或安全问题所产生的错误。

 

·     UnsatisfidLinkError : Java虚拟机无法找到合适的原始语言( Native-Language)定义的方法所产生的错误。

 

·     IncompatibleClassChangeError : 不兼容类所产生的错误。

 

·     AbtractMethodError : 调用抽象方法所产生的错误。

 

·     NoSuchFieldError : 存取或改变数据域所产生的错误。

 

·     NoSuchMethodError : 调用类方法所产生的错误。

 

·     IllegalAccessError : 不合法存取或改变数据域调用方法所产生的错误。

 

·     InstantiationError : 使用抽象类或接口所产生的错误。

 

2. VitualmachineError

当 Java 虚拟机崩溃了或用尽了它继续操作所需的资源时,抛出该错误。

 

VitualmachineError 包含 InternalError OutOfMemoryError StackOverflow Error UnknownError 。这些类所代表的意义如下所述。

 

·     InternalError : 虚拟机内部所产生的错误。

 

·     OutOfMemoryError : 虚拟机内存不足所产生的错误。

 

·     StackOverflowError : 堆栈无法容纳所产生的错误。

 

·     UnknownError : 虚拟机不知名异常所产生的错误。

5.  总结

1)   异常分运行时异常和检查异常(编译异常),其中运行时异常java编译器是不会处理的,

如抛出NumberFormatException时:

    publicstaticint  aa() {

        thrownew NumberFormatException();

}

抛出IOException时则必须抛出方法或者在方法类捕获,而且抛出方法时,则调用该方法的地方也需要抛出或者捕获该异常,否则java编译器会报错。

    publicstaticint  aa() throws IOException {

        thrownew IOException();

}

2)   捕获异常时,有时需要捕获Throwable即:

    try {

    } catch (Throwable e) {

        e.printStackTrace();

    }

     因为发生内存溢出等错误时只是捕获Exception是捕获不到的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值