异常处理
异常处理概述
使用返回值状态标识异常
public String abc(){
......
returen str;
}
异常处理机制
当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,Java虚拟机检测寻找try关键字匹配的处理异常的catch块。
异常的捕获和处理
Throwble / Error / Exception
Java异常结构中定义有Throwable类,Exception和Error是派生的两个子类。
Exception表示:网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常,这类异常是可以通过Java异常捕获机制处理的。
Error表示:Java运行时环境出现的异常,例如JVM内存溢出等。
try_catch
try{…}语句指定类一段代码,该代码块可以一次捕获并处理范围内的多个异常。在程序执行过程中,该代码块可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句分别对这些异常作出相应的处理。
如果没有异常产生,所有的catch语句都将被略过不执行。
在catch语句块中是对异常进行处理的代码。catch中声明的异常对{catch(Exception e)}
封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。
-
其语法结构为:
... try{ ...//可能出现的异常 }catch(Exception e){ ...//处理该异常的代码块 } ...
多个catch
每个catch语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常。catch捕获的异常类型由上至下的捕获异常类型的顺序应是子类到父类(即小到大)。
//例如
try{
...
}catch(NullPointerException e){ //子类异常应在上面捕获
...
}catch(RunTimeException e){ //父类异常在下面捕获
...
}catch(Exception e){ //捕获Exception的异常放最下面
...
}
通常在书代码写时,应当做最后一个catch中捕获Exception,这样可以保证代码不会因为出现一个未在catch中声明的异常而导致捕获失败使得程序终止。
finally的作用
finally语句为异常处理提供一个统一的出口,使得在控制流程到程序其他部分以前,能够对程序的状态统一管理。
无论try所指定的程序块中是否抛出异常,finally所指定的代码都要被执行,通常在finally语句中可以进行资源的消除工作,如:关闭打开的文件、删除临时文件等。
finally语句块只能定义在try语句块之后,或者是最后一个catch语句块之后,且只能定义一次。
throw关键字
当程序发生错误而无法处理时,会抛出对应的异常对象,除此之外,在某些时刻,会想要自行抛出异常,例如在异常处理结束后,再将异常抛出,让下一层异常处理区块来捕捉。若想自从抛出异常,可以使用“throw”关键词,并生成指定的异常对象。
//例如
public static void StringToDate(String str) throw PraseException{...}
throws方法的重写
当使用继承时,在父类的某个方法上生声明了throws抛出某些异常,而在子类中重写该方法时,我们可以使用以下的操作:
- 不处理异常(重写方法时不声明throws)
- 可仅在throws中声明父类中声明的部分异常
- 可以在throws中声明父类方法汇总抛出的异常的子类异常。
但是不能进行以下操作:
- 重写方法时在throws中声明抛出额外的异常
- 重写方法时在throws中声明父类方法中声明的抛出异常的父类异常
Java异常的API
RuntimeException
Java 异常可以分为可检测异常和非检测异常。
可检测异常:可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常编译器就不通过,不允许编译。
非检测异常:非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采用任何适当操作,编译器不会检测是否已经解决了这样的一个异常。
常见RuntimeException
-
常见的其异常包括:
IllegalArgumentException;
抛出的异常表明方法传递了一个不合法或不正确的参数NullPointerException;
当应用程序试图在需要的地方使用 null 时,抛出该异常ArrayIndexOutOfBoundsException;
当使用的数组下标超出数组允许范围时,抛出该异常ClassCastException;
当时图将对象强制转化为不是实例的子类时,抛出该异常NumberFormatException;
当程序员试图将字符串转换成一种数值类型,但格式不适当时,抛出该异常
Exception常用API
printStackTrace
Throwable中定义了一个方法可以输出错误信息,用来跟踪异常事件发生时执行堆栈的内容。
-
该方法的定义为:
void printStackTrace();
//例如
try{
...
}catch(Exception e){
e.printStackTrace(); //输出执行堆栈信息
}
getMessage
Throwbale中定义了一个方法可以得到有关异常事件的信息。
- 该方法的定义为:
String GetMessage();
try{
...
}catch(Exception e){
System.out.println(e.getMessage());
}
getCause
很对时候,当一个异常由另一个异常导致异常而被抛出的时候,Java库和开放源代码会将一种异常包装成另一种异常。这时,日志记录和打印根异常就变的非常重要。Java异常提供了getCause()方法来检索导致异常的原因,这些可以对异常根层次的原因提供更多的信息。该Java功能对代码的调试或故障排除有很大的帮助。另外,如果要把一个异常包装成另一种异常,构造一个新异常就要传递源异常。
-
该方法的定义为:
Throwable getCause();
获取该异常出现的原因
自定义Exception
自定义异常的意义
Java异常机制可以保证程序更安全和更健壮。虽然Java类库已经提供了很多可以直接处理异常的类,但是有时候为了更加精准地捕获和处理异常以呈现更好的用户体验,需要开发者自定义异常。
继承Exception自定义异常
创建自定义异常类,语法格式:
public class [自定义异常类名] extends Exception{...}
其构造方法的编写
当定义好自定义异常后,我们可以通过Ecplice来自动生成相应的构造方法。
具体步骤如下:
- 声明个类并继承自Exception
- 右键点击score
- 选择Generate Constructors form Superclass
- 选择父类中所有构造方法后确认生成
public class MyException exdents Exception{
public MyException(){
super();
}
public MyException(String message, Throwable cause){
super(message, cause);
}
public MyException(String message){
super(message);
}
public MyException(Throwable cause){
super(cause);
}
}