1、异常的继承结构
运行时异常(非受检异常指的是java.lang.RuntimeException和java.lang.Error类及其子类)也称为未受检异常、非受控异常,受检异常又称为编译时异常、受控异常。异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。
所有异常都是发生在运行阶段,因为只有在运行阶段才能new对象,异常的发生就是new异常对象。
编译阶段并不会发生异常,因为编译时异常必须在编译阶段预先处理,如果不处理编译器报错,因此得名。
(1)运行时异常:
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.EnumConstantNotPresentException
Java.lang.IllegalArgumentException
Java.lang.IllegalThreadStateException
Java.lang.NumberFormatException
Java.lang.IllegalMonitorStateException
Java.lang.IllegalStateException
Java.lang.IndexOutOfBoundsException
Java.lang.ArrayIndexOutOfBoundsException
Java.lang.StringIndexOutOfBoundsException
Java.lang.NegativeArraySizeException’
Java.lang.NullPointerException
Java.lang.SecurityException
Java.lang.TypeNotPresentException
Java.lang.UnsupprotedOperationException
(2)编译时异常:
Java.lang.ClassNotFoundException
Java.lang.CloneNotSupportedException
Java.lang.IllegalAccessException
Java.lang.InterruptedException
Java.lang.NoSuchFieldException
Java.lang.NoSuchMetodException
SQLException
2、编译时异常和运行时异常的区别
(1)编译时异常发生(对于发生概率较高的异常在运行之前需要进行预处理)的概率较运行时异常(概率较低,没必要进行预处理)高,如果java没有将异常进行划分,那么所有的异常都需要进行预处理,虽然程序更加安全,但是程序员的的工作量将大大增加
(2)编译时异常与受检异常的选用:
一直以来,关于在程序中到底是该使用受检异常还是非受检异常,开发者之间一直存在着争议,毕竟两类异常都各有优缺点。受检异常的特点在于它强制要求开发人员在代码中进行显式的声明和捕获,否则就会产生编译错误。这种限制从好的方面来说,可以防止开发人员意外地忽略某些出错的情况,因为编译器不允许出现未被处理的受检异常;从不好的方面来说,受检异常对程序中的设计提出了更高的要求。不恰当地使用受检异常,会使代码中充斥着大量没有实际作用、只是为了通过编译而添加的代码。而非受检异常的特点是,如果不捕获异常,不会产生编译错误,异常会在运行时刻才被抛出。
非受检异常的好处是可以去掉一些不需要的异常处理代码,而不好之处是开发人员可能忽略某些应该处理的异常。一个典型的例子是把字符串转换成数字时会发生java.lang.NumberFormatException异常,忽略该异常可能导致一个错误的输入就造成整个程序退出。
目前的主流意见是,最好优先使用非受检异常。
转自:http://blog.csdn.net/nlznlz/article/details/53271045
(3)处理方式
受检异常:JAVA编译器强制要求我们必需对出现的这些异常进行catch
运行时异常:是代码的错误,我们可以不处理,当出现这样的异常时,总是由虚拟机接管