Throwable类是整个Java异常体系的超类,都有的异常类都是派生自这个类。包含Error和Exception两个直接子类。数据库
Error类通常是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的致使的应用程序中断,仅靠程序自己没法恢复和预防,遇到这样的错误,建议让程序终止。
Exception是应用层面上最顶层的异常类,包含RuntimeException(运行时异常)和 Checked Exception(受检异常)。编程
RuntimeException是一种Unchecked Exception,即表示编译器不会检查程序是否对RuntimeException做了处理,在程序中没必要捕获RuntimException类型的异常,也没必要在方法体声明抛出RuntimeException类。通常来讲,RuntimeException发生的时候,表示程序中出现了编程错误,因此应该找出错误修改程序,而不是去捕获RuntimeException。网络
常见的Runtime异常:ide
ArithmeticException(算术异常) 1/0函数
ClassCastException (类转换异常)integer转换string异常指针
IllegalArgumentException (非法参数异常) 参数为int输出倒是stringcode
NullPointerException (空指针异常)blog
Checked Exception是相对于Unchecked Exception而言的,全部继承自Exception而且不是RuntimeException的异常都是Checked Exception。JAVA 语言规定必须对checked Exception做处理,编译器会对此做检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,否则不能经过编译。继承
经常使用的Checked Exception有内存
IOException、
ClassNotFoundException 找到不到指定类
Java异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws。下面将骤一介绍,经过认识这五个关键字,掌握基本异常处理知识。
• try -- 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块以内,当try语句块内发生异常时,异常就被抛出。
• catch -- 用于捕获异常。catch用来捕获try语句块中发生的异常。
• finally -- finally语句块老是会被执行。它主要用于回收在try块里打开的物力资源(如数据库链接、网络链接和磁盘文件)。只有finally块执行完成以后,才会回来执行try或者catch块中的return或者throw语句,若是finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接中止。
• throw -- 用于抛出特定的异常。
• throws -- 用在方法签名中,用于声明该方法可能抛出的异常。
多重catch编写注意:
catch异常控制的范围应该由小及大,若是把父类异常写到前面,会屏蔽后面的子类异常。由于一次只会有一个catch会被匹配到。
RuntimeException异常类包括运行时各类常见的异常,ArithmeticException类和ArrayIndexOutOfBoundsException类都是它的子类。所以,RuntimeException异常类的catch子句应该放在最后面,不然可能会屏蔽其后的特定异常处理或引发编译错误。
Throw: 写在函数方法内部的,抛出指定的异常。
Throws: 修饰函数头部
Throws抛出异常的规则:
若是想要抛出的是不受检查异常(unchecked exception),那么能够不使用throws关键字来声明要抛出的异常,编译仍能顺利经过,但在运行时会被系统抛出。好比你throws了RuntimeException,可是他是unchecked类型异常,引用时不须要用try catch包围起来。
public class ExceptionDemo2 { static void throw1() throws RuntimeException { System.out.println("Inside throw1 . "); throw new RuntimeException("demo"); } public static void main(String[] args){ throw1(); } }
若是想要抛出的是检查异常(checked exception)。要么用try-catch语句捕获,要么用throws子句声明将它抛出,不然会致使编译错误。
public class ExceptionDemo2 { static void throw1() throws IllegalAccessException { System.out.println("Inside throw1 . "); throw new IllegalAccessException("demo"); } public static void main(String[] args){ try { throw1(); }catch(IllegalAccessException e ){ System.out.println("Caught " + e); } } }