Java异常摘要

1、异常机制

异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

2、异常处理流程

在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛弃(throw)异常。当Java运行时系统得到一个异常对象时,它将会寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异的方法,则运行时系统将终止,相应的Java程序也将退出。

3、异常分类

3.1 执行异常

执行异常即运行时异常,继承于RuntimeException。Java编译器允许程序不对它们做出处理。下面列出了主要的运行时异常:
ArithmeticException:一个不寻常算术运算产生的异常。
ArrayStoreException:存入数组的内容数据类型不一致所产生的异常。
ArrayIndexOutOfBoundsException:数组索引超出范围所产生的异常。
ClassCastExcption:类对象强迫转换造成不当类对象所产生的异常。
IllegaArgumentException:程序调用时,返回错误自变量的数据类型。
IllegaThreadStateException:线程在不合理状态下运行所产生的异常。
NumberFormatException:字符串转换数值所产生的异常。
IllegaMonitorStateException:线程等候或通知对象时所产生的异常。
IndexOutOfBoundsException:索引超出范围所产生的异常。
NegativeException:数组建立负值索引所产生的异常。
NullPointerException:对象引用参考值为null所产生的异常。
SecurityException:违反安全所产生的异常。

3.2 检查异常

除了执行异常外,其余的子类是属于检查异常类也称为非运行时异常,它们都在java.lang类库内定义。Java编译器要求程序必须捕获或者声明抛弃这种异常。下面列出了主要的检查异常:
ClassNotFoundException:找不到类或接口所产生的异常。
CloneNotSupportedException:使用对象的clone方法但无法执行Cloneable所产生的异常。
IllegaAccessException:类定义不明确所产生的异常。
InstantiationException:使用newInstance方法试图建立一个类instance时所产生的异常。
InterruptedException:目前线程等待执行,另一线程中断目前线程所产生的异常。

3.3 错误异常

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

打开JDK的ThreadDeath类的文档,可以看到下面这段说明:“特别地,虽然出现ThreadDeath是一种‘正常的情形’,但ThreadDeath类是Error而不是Exception的子类,因为许多应用会捕获所有的Exception然后丢弃它不再理睬。”这段话的意思是,虽然ThreadDeath代表的是一种普通的问题,但鉴于许多应用会试图捕获所有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子类,因为Error类代表的是一般的应用不应该去捕获的严重问题。

3.3.1 linkageError

LinkageError 的子类表示一个类依赖于另一个类,但是,在前一个类编译之后,后一个类的改变会与它不兼容。
linkageError包括ClassFormarError,ClassCircularityError,ExceptionIn- InitializerError,NoClassDeFormatError,VeritfyError,UnsatisfidLinkError和IncompatibleClassChangeError等子类。其中IncompatibleClassChangeError类又包含AbtractMethodError,NoSuchFieldError,NoSchMethodError,IllegalAccessError,InstantionError。这些类所代表的意义是:
ClassFormarErro:类格式所产生的错误。
ClassCircularityError:无限循所产生的错误。
ExceptionInInitializerError:初始化所产生的错误。
NoClassDeFormatError:没有类定义所产生的错误。
VeritfyError:类文件某些数据不一致或安全问题所产生的错误。
UnsatisfidLinkError:Java虚拟机无法找到合适的原始语言(native-language)定义的方法所产生的错误。
IncompatibleClassChangeError:不兼容类所产生的错误。
AbtractMethodError:调用抽象方法所产生的错误。
NoSuchFieldError:存取或改变数据域所产生的错误。
NoSchMethodError :调用类方法所产生的错误。
IllegalAccessError:不合法存取或改变数据域或调用方法所产生的错误。
InstantionError:使用抽象类或接口所产生的错误。

3.3.2 VitualmachineError

当Java虚拟机崩溃了或用尽了它继续操作所需的资源时,抛出该错误。
VitualmachineError包含InternalError,OutOfMemoryError ,StackOverflow- Error,UnknownError。这些类所代表的意义:
InternalError:虚拟机内部所产生的错误。
OutOfMemoryError:虚拟机内存不足所产生的错误。
StackOverflowError:堆栈无法容纳所产生的错误。
UnknownError:虚拟机不知名异常所产生的错误。

4、异常之间的区别与联系

4.1 Error与Exception

Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。

4.2 运行时异常和非运行时异常

运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

5、Java异常处理总结

5.1 既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。改正主要有四个选择:

1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。再次说明,调用printStackTrace算不上已经“处理好了异常”。 
2、重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也不失为一种选择。 
3、把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(其含义更容易被用户了解的异常)。 
4、不要捕获异常。

5.2 在catch语句中尽可能指定具体的异常类型,必要时使用多个catch。不要试图处理所有可能出现的异常。
5.3 保证所有资源都被正确释放。充分运用finally关键词。
5.4 在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读。

因此,在出现异常时,最好能够提供一些文字信息。例如当前正在执行的类、方法和其他状态信息,包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。

5.5 尽量减小try块的体积。
5.6 全面考虑可能出现的异常以及这些异常对执行流程的影响。

较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值