异常就是在程序的运行过程当中所发生的不正常的事件,它会中断正在运行的程序。html
异常不是错误java
程序中关键的位置有异常处理,提升程序的稳定性程序员
Java的异常处理是经过5个关键字来实现的数据库
try:尝试,把有可能发生错误的代码放在其中,必须有数组
catch:捕获,当发生异常时执行安全
finally:最终,不论是否有异常都将执行app
throw:抛出,引起异常jsp
throws:抛出多个,声明方法将产生某些异常ide
Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。函数
Throwable又派生出Error类和Exception类。
错误:Error类以及他的子类的实例,表明了JVM自己的错误。错误不能被程序员经过代码处理,Error不多出现。所以,程序员应该关注Exception为父类的分支下的各类异常类。
异常:Exception以及他的子类,表明程序运行时发送的各类不指望发生的事件。能够被Java异常处理机制使用,是异常处理的核心。
算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityException 文件已结束异常:EOFException 文件未找到异常:FileNotFoundException 字符串转换为数字异常:NumberFormatException 操做数据库异常:SQLException 输入输出异常:IOException 方法未找到异常:NoSuchMethodException java.lang.AbstractMethodError 抽象方法错误。当应用试图调用抽象方法时抛出。 java.lang.AssertionError 断言错。用来指示一个断言失败的状况。 java.lang.ClassCircularityError 类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。 java.lang.ClassFormatError 类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。 java.lang.Error 错误。是全部错误的基类,用于标识严重的程序运行问题。这些问题一般描述一些不该被应用程序捕获的反常状况。 java.lang.ExceptionInInitializerError 初始化程序错误。当执行一个类的静态初始化程序的过程当中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。 java.lang.IllegalAccessError 违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,可是又违反域或方法的可见性声明,则抛出该异常。 java.lang.IncompatibleClassChangeError 不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。通常在修改了应用中的某些类的声明定义而没有对整个应用从新编译而直接运行的状况下,容易引起该错误。 java.lang.InstantiationError 实例化错误。当一个应用试图经过Java的new操做符构造一个抽象类或者接口时抛出该异常. java.lang.InternalError 内部错误。用于指示Java虚拟机发生了内部错误。 java.lang.LinkageError 连接错误。该错误及其全部子类指示某个类依赖于另一些类,在该类编译以后,被依赖的类改变了其类定义而没有从新编译全部的类,进而引起错误的状况。 java.lang.NoClassDefFoundError 未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 java.lang.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。 java.lang.NoSuchMethodError 方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。 java.lang.OutOfMemoryError 内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。 java.lang.StackOverflowError 堆栈溢出错误。当一个应用递归调用的层次太深而致使堆栈溢出时抛出该错误。 java.lang.ThreadDeath 线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。 java.lang.UnknownError 未知错误。用于指示Java虚拟机发生了未知严重错误的状况。 java.lang.UnsatisfiedLinkError 未知足的连接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。 java.lang.UnsupportedClassVersionError 不支持的类版本错误。当Java虚拟机试图从读取某个类文件,可是发现该文件的主、次版本号不被当前Java虚拟机支持的时候,抛出该错误。 java.lang.VerifyError 验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。 java.lang.VirtualMachineError 虚拟机错误。用于指示虚拟机被破坏或者继续执行操做所需的资源不足的状况。 java.lang.ArithmeticException 算术条件异常。譬如:整数除零等。 java.lang.ArrayIndexOutOfBoundsException 数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。 java.lang.ArrayStoreException 数组存储异常。当向数组中存放非数组声明类型对象时抛出。 java.lang.ClassCastException 类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常常常被称为强制类型转换异常。 java.lang.ClassNotFoundException 找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH以后找不到对应名称的class文件时,抛出该异常。 java.lang.CloneNotSupportedException 不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。 java.lang.EnumConstantNotPresentException 枚举常量不存在异常。当应用试图经过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。 java.lang.Exception 根异常。用以描述应用程序但愿捕获的状况。 java.lang.IllegalAccessException 违法的访问异常。当应用试图经过反射方式建立某个类的实例、访问该类属性、调用该类方法,而当时又没法访问类的、属性的、方法的或构造方法的定义时抛出该异常。 java.lang.IllegalMonitorStateException 违法的监控状态异常。当某个线程试图等待一个本身并不拥有的对象(O)的监控器或者通知其余线程等待该对象(O)的监控器时,抛出该异常。 java.lang.IllegalStateException 违法的状态异常。当在Java环境和应用还没有处于某个方法的合法调用状态,而调用了该方法时,抛出该异常。 java.lang.IllegalThreadStateException 违法的线程状态异常。当县城还没有处于某个方法的合法调用状态,而调用了该方法时,抛出异常。 java.lang.IndexOutOfBoundsException 索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。 java.lang.InstantiationException 实例化异常。当试图经过newInstance()方法建立某个类的实例,而该类是一个抽象类或接口时,抛出该异常。 java.lang.InterruptedException 被停止异常。当某个线程处于长时间的等待、休眠或其余暂停状态,而此时其余的线程经过Thread的interrupt方法终止该线程时抛出该异常。 java.lang.NegativeArraySizeException 数组大小为负值异常。当使用负数大小值建立数组时抛出该异常。 java.lang.NoSuchFieldException 属性不存在异常。当访问某个类的不存在的属性时抛出该异常。 java.lang.NoSuchMethodException 方法不存在异常。当访问某个类的不存在的方法时抛出该异常。 java.lang.NullPointerException 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。 java.lang.NumberFormatException 数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不知足数字类型要求的格式时,抛出该异常。 java.lang.RuntimeException 运行时异常。是全部Java虚拟机正常操做期间能够被抛出的异常的父类。 java.lang.SecurityException 安全异常。由安全管理器抛出,用于指示违反安全状况的异常。 java.lang.StringIndexOutOfBoundsException 字符串索引越界异常。当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。 java.lang.TypeNotPresentException 类型不存在异常。当应用试图以某个类型名称的字符串表达方式访问该类型,可是根据给定的名称又找不到该类型是抛出该异常。该异常与ClassNotFoundException的区别在于该异常是unchecked(不被检查)异常,而ClassNotFoundException是checked(被检查)异常。 java.lang.UnsupportedOperationException 不支持的方法异常。指明请求的方法不被支持状况的异常。 异常 javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login (/Login是你的action名字) 可能缘由 action没有再struts-config.xml 中定义,或没有找到匹配的action,例如在JSP文件中使用 <html:form action="Login.do".将表单提交给Login.do处理,若是出现上述异常,请查看struts-config.xml中的定义部分,有时多是打错了字符或者是某些不符合规则,可使用strutsconsole工具来检查。
非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。因此若是愿意,咱们能够编写代码处理(使用try…catch…finally)这样的异常,也能够不处理。对于这些异常,咱们应该修正代码,而不是去经过异常处理器处理 。这样的异常发生的缘由多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。
检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常作预备处理工做(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,不然编译不会经过。这样的异常通常是由程序的运行环境致使的。由于程序可能被运行在各类未知的环境下,而程序员没法干预用户如何使用他编写的程序,因而程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。
须要明确的是:检查和非检查是对于javac来讲的,这样就很好理解和区分了。
throws声明:若是一个方法内部的代码会抛出检查异常(checked exception),而方法本身又没有彻底处理掉,则javac保证你必须在方法的签名上使用throws关键字声明这些可能抛出的异常,不然编译不经过。
throws是另外一种处理异常的方式,它不一样于try…catch…finally,throws仅仅是将函数中可能出现的异常向调用者声明,而本身则不具体处理。
采起这种异常处理的缘由多是:方法自己不知道如何处理这样的异常,或者说让调用者处理更好,调用者须要为可能发生的异常负责。
最简单的判断点有两个:
1.继承自RuntimeException或Error的是非检查型异常,而继承自Exception的则是检查型异常(固然,RuntimeException自己也是Exception的子类)。
2.对非检查型类异常能够不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。
Java 的异常结构以下图。其中直接继承Exception的异常,必须捕获,属于检查型异常。
//运行期异常 throw new RuntimeException("不须要声明异常"); //检查时异常 throw new Exception("须要声明异常");
一、运行时异常
运行异常的特色是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即便没有用try...catch语句捕获它,也没有用throws字句声明抛出它,仍是会编译经过。
二、受检查异常
除了运行异常外,其余异常都属于受检查异常,这种异常的特色是要么用try...catch捕获处理,要么用throws语句声明抛出,不然编译不会经过。
三、二者的区别
运行异常表示没法让程序恢复运行的异常,致使这种异常的缘由一般是因为执行了错误的操做。一旦出现错误,建议让程序终止