一、什么是异常?
在java程序运行时,常出现一些非正常的现象,这种情况称为“运行错误”。根据性质可以分为“错误”和“异常”。
Java程序中(无论谁写的代码),所有抛出的(throw)的异常,都必须从Throwable派生而来,类Throwable有两个直接的子类:Error和Exception
1.Error类
Error类对象由java虚拟机(JVM)生成并抛弃(通常java程序不对此类异常进行处理)。一般来说最常见的错误:程序内存泄漏等。
此情况下,程序本身无法解决,只能通过其他程序干预。
2.Exception异常类
异常是程序执行时遇到的非正常情况或意外行为。 以下情况都可以引发异常:代码或调用的代码(如共享库中)有错误,操作系统资源不可用、公共语言运行库遭遇意外情况(如无法验证代码)等。
Exception体系包括RuntimeException体系和其他非RuntimeException的体系
a. RuntimeException
RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。
b.其他非RuntimeException(IOException等等)
这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
3.RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
二、常见的异常有:
NO.1
java.lang.NullPointerException
java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.RuntimeException
???????java.lang.NullPointerException
这个异常的解释是 "程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,对数组操作中出现空指针,很空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)
当应用程序试图在需要对象的地方使用 null 时,抛出该异常。
NO.2
java.lang.ClassNotFoundExceptionjava.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.ClassNotFoundException
这个异常的解释是 "指定的类不存在 ",这里主要考虑一下类的名称和路径是否正确即可.Class 类中的 forName 方法。
ClassLoader 类中的 findSystemClass 方法。
ClassLoader 类中的 loadClass 方法。
NO.3
java.lang.ArithmeticException
java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.RuntimeException
???????java.lang.ArithmeticException
当出现异常的运算条件时,抛出此异常。己程序中涉及到数学运算的地方,公式是不是有不妥了。
NO.4
java.lang.ArrayIndexOutOfBoundsExceptionjava.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.RuntimeException
???????java.lang.IndexOutOfBoundsException
????java.lang.ArrayIndexOutOfBoundsException
这个异常的解释是 "数组下标越界 ",现在程序中大多都有对数组的操作,因此在调用数组的时候一即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时
候,最好先查看一下数组的length,以免出现这个异常。
NO.5
java.lang.IllegalArgumentException
?????java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.RuntimeException
???????java.lang.IllegalArgumentException
这个异常的解释是 "方法的参数错误",很多J2ME的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数。如果写成负数就会出现这个异常,再比如 g.setColor(int red,int green,intblue)这个方法中的三个值,如果有超过255的也会出现.
NO.6
java.lang.IllegalAccessException
java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.IllegalAccessException
这个异常的解释是 "没有访问权限",当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中
用了Package的情况下要注意这个异常。方法或构造方法的定义时,抛出 IllegalAccessException。
NO.7
java.lang.IncompatibleClassChangeError
java.lang.Object
?? java.lang.Throwable
??????java.lang.Error???java.lang.LinkageError
???????java.lang.IncompatibleClassChangeError
不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而在某些类定义中出现不兼容的类更改时抛出该异常。某些目前执行的方法所依赖的类定义已发生了变化。
NO.8
java.lang.InstantiationError
java.lang.Object
?? java.lang.Throwable
??????java.lang.Error
???java.lang.LinkageError
???????java.lang.IncompatibleClassChangeError
????java.lang.InstantiationError
实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常
.NO.9
java.lang.LinkageError
java.lang.Object
?? java.lang.Throwable
??????java.lang.Error???java.lang.LinkageError
链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进LinkageError的子类指示一个类在一定程度上依赖于另一个类;但是,在编译前一个类之后,后一个类发生了不相容的改变。
NO.10
java.lang.StackOverflowError
java.lang.Object
?? java.lang.Throwable
??????java.lang.Error???java.lang.VirtualMachineError
???????java.lang.StackOverflowError
堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。
NO.11
java.lang.Exception
java.lang.Object
?? java.lang.Throwable
??????
java.lang.Exception
Exception类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。(异常层次结构的根类)
NO.12
java.lang.RuntimeExceptionjava.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???
java.lang.RuntimeException
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException的任何子类都无需在 throws 子句中进行声明。 (java.lang中异常的基类)
NO.13
java.util.InputMismatchException
java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.RuntimeException
???????java.util.NoSuchElementException
????
java.util.InputMismatchException由 Scanner 抛出,表明用于检索的标记与期望类型的模式不匹配,或者该标记处在期望类型的范围之外。
NO.14
java.io.IOException
java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???
java.io.IOException当发生某种 I/O 异常时,抛出此异常。此类为异常的通用类,它是由失败的或中断的 I/O 操作生成的。
NO.15
java.io.FileNotFoundException
java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.io.IOException
???????
java.io.FileNotFoundException当试图打开指定路径名表示的文件失败时,抛出此异常。
在不存在具有指定路径名的文件时,此异常将由 FileInputStream、FileOutputStream 和RandomAccessFile 构造方法抛出。
NO.16
java.io.EOFException
java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.io.IOException
???????
java.io.EOFException当输入过程中意外到达文件或流的末尾时,抛出此异常。
NO.17
java.lang.InterruptedException
java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.InterruptedException
当线程在很长一段时间内一直处于正在等待、休眠或暂停状态,而另一个线程用 Thread 类中的 iterrupt方法中断它时,抛出该异常。
NO.18
java.lang.NumberFormatException
?????java.lang.Object
?? java.lang.Throwable
??????java.lang.Exception
???java.lang.RuntimeException
???????java.lang.IllegalArgumentException
????java.lang.NumberFormatException
主要原因是将用户提交的内容转换为整数或者浮点数时用户输入了其它非法字符。