一、Java异常处理机制
1、Exception类
Java异常处理中定义是Throwable类,Exception和Error是其派生的两个子类。
Error:JRE出现的错误,程序员无能为力,我们不能通过代码的方式解决这类错误。如:内存资源耗尽。
Exception:表示由于网络故障,文件损坏,设备错误,用户输入非法等情况导致的异常。
异常处理的目的是当异常发生时妥善的终止程序,避免灾难性后果的发生,包括;
通知 向用户通知异常的发生。
恢复 保存重要数据,关闭文件回滚事务等。
退出 以恰当的形式退出程序。
Java使用try-catch来完成对异常的捕获和解决。
2、try语句
try{...}指定了一段代码,该段该码就是一次捕获并处理例外的范围(可能出现错误的代码判断)。
try{...}可以独立存在;try{...}后边通常会紧跟一个或多个catch块;catch是用来捕获异常并解决出现的这类异常的。
执行过程中,try{...}代码可能抛出一种或几种异常对象,后面的catch分别对这些异常做相应的处理。
如果没有例外产生,catch将被忽略不执行。
3、catch语句
在catch中声明的异常对Exception封装了异常事件发生的信息,在catch中可以使用这个对象的一些方法获取这些信息。
如:
getMessage()方法,用来得到有关异常事件的信息。
printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容。
String[] arrays=null;
try {
System.out.println(arrays.length);
} catch (NullPointerException e) {
System.out.println(e.getMessage());
}
System.out.println("END");
异常输出是异步的。
4、throw语句
我们可以自行抛出异常,例如在异常处理结束后,再将异常抛出,让下一层异常处理区块来捕捉。
如:throw new ArithmeticException();
String[] arrays=null;
try {
System.out.println(arrays.length);
} catch (NullPointerException e) {
throw(e);
}
System.out.println("END");
4、throws声明
程序中会定许多方法(Method),这种方法可能会因为某些错误而引发异常,但你不希望直接在这个方法中处理这些异常,而希望调用这个它的方法来同一处理,这时候你可以使用throws来声明这个方法将会抛出异常。
例:public static void stringToDate(String str) throws ParseException{}
通常:方法中抛出什么样的异常就应该在方法声明的时候直接抛出相关异常。
4、finally
finally语句块为异常处理提供一个统一的出口,使得在控制流程转换到程序其他部分以前,能够对程序的状态作统一管理。
无论try所指定的程序快中是否抛出例外,finally所指定的代码都要执行。
finally中通常进行资源的消除工作,如关闭打开的文件,删除临时文件等。
一般写在catch或者try之后。
5、RuntimeException
Java异常可以分为可检测异常,非检测异常和自定义异常。
RuntimeException属于非检查性异常,也就是在编译过程中,会忽略检查该类异常方法在声明中定义的抛出。
当是RuntimeException及其子类在方法中被抛出异常时候,不需要在方法中声明该类异常的抛出。
常见的异常类:
NullPointerException 空指针异常
NumberFormatException 数字格式异常
ArrayIndexOutOfBoundsException 数组下边越界
ClassCastException 造型异常
6、重写方法时的异常处理
在有多个catch时,通常异常大小关系,大类型在后面处理。
如果使用继承时,在父类的某个方法中宣告了throws某些异常,而在子类类别中重新定义该方法时,你可以:
不处理异常,就是在重新定义时候不设定throws。
仅抛出父类中定义的某些异常。
抛出父类定义的异常的子类异常。
但是不可以:
throws额外的异常(父类 没有的异常)。
throws父类方法声明的异常的父类异常。
-----
throw是抛出异常,当方法中遇到该语句时,方法结束,并抛出异常。所以throw后面不要再有必然会执行的语句,否则编译错误。