异常
- 异常架构
Throwable是所有异常的父类,下面分为两个主要的异常情况Error和Exception,Error异常一般情况下会造成程序的崩溃,使得程序无法进行。Exception异常分为运行异常(RuntimeException)和检查异常,运行异常包含空指针异常,数组下标越界异常,类型转换异常和算数异常等,这些异常属于编写程序的语法错误,可以被编辑器发现。检查异常主要是文件异常或SQL异常等,这些异常都需要被捕获处理。
- 异常处理
主要用try-catch-finally结构块来捕获处理异常。在try结构中写入会出现异常的代码,在catch中进行捕获。
例:
try {
//一些会抛出异常的方法
} catch(Exception e) {
//捕获某项异常
} catch(Exception e) {
//捕获某项异常
} finally {
//最终要执行的方法
}
其中要注意的catch要按照从子到父的顺序来捕获异常,否则会产生编译错误。
- 调用顺序:先执行try块中的代码,如果捕获异常,则执行catch中的代码,最后执行finally中的代码
- 异常抛出
- throw:将产生的异常抛出
- throws:声明将要抛出何种类型的异常。例:
public float divide(int a, int b) throws Exception {
if(b == 0)
throw new Exception("除数不能为0");
else
return a/b;
}
当调用到会产生异常的函数时,有两种处理方式,一种是直接捕获异常进行处理,另一种是将异常继续抛出,再让上一级的调用者去处理该异常。
public void calculator(){
//直接进行异常的捕获处理
try {
System.out.println(divide(5, 0));
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
public void calculator() throws Exception {
System.out.println(divide(5, 0));
}
- 自定义异常:可以通过创建一个类去继承相近的异常类,或直接继承异常的基类Exception。这样我们就可以在这个类中描述一个新的异常。
public class ClassName extends 异常类型{
······
}
- 异常链:用户可以在方法中抛出一个异常,去让调用这个方法的对象去捕获该异常,这样就能形成一条异常链。
例:
//定义一个查找失败的异常
public class FoundException extends Exception{
public FoundException(String message){
super(message);
}
public FoundException(){
super();
}
}
public class Initiation{
public static void main(String arg[]){
Initiation init = new Initiation();
init.test2();
}
public void test1() throw FoundExption{
throw new FoundExption("not found exception")
}
public void test2(){
try {
test1();
} catch(FoundException e){
RuntimeException rt = new RuntimeException("runtime exception");
rt.initCause(e);
throw rt;
}
}
}
运行后结果如下:
Exception in thread "main" java.lang.RuntimeException: run time exception.
at com.java.exception.Initiation.test2(Initiation.java:20)
at com.java.exception.Initiation.main(Initiation.java:8)
Caused by: com.java.exception.FoundException: not found message.
at com.java.exception.Initiation.test1(Initiation.java:12)
at com.java.exception.Initiation.test2(Initiation.java:17)
... 1 more