Java中errors以及try-catch相关
- 异常类型最高的继承类是Throwable, Throwable下有两个子类:
(1)Error:指的是JVM错误,这个时候的程序并没有执行,无法处理;
(2)Exception:指的是程序之中出现的错误信息,可以进行异常处理。
Exception分为RuntimeException和Checked Exception。Checked Exception必须要捕获或声明。而RuntimeException不强制,一般交由JVM处理。详见此处
RuntimeException在程序中是完全可以避免的,如数组下表越界及空指针异常都是可以避免的,判断下下标范围,而CheckedException是无法避免的,如IO异常,磁盘坏道了是程序员无法控制的。
final的问题:假设利用 return 语句从 try 语句块中退出。在方法返回前,finally子句的内容将被执行。如果 finally 子句中也有一个 return 语句,这个返回值将会覆盖原始的返回值。
public static void main(String[] args) {
int k = f_test();
System.out.println(k);
}
public static int f_test(){
int a = 0;
try{
a = 1;
return a;
}
finally{
System.out.println("It is in final chunk.");
a = 2;
return a;
}
}
输出:
It is in final chunk.
2
//如果将 return a; 注释掉,将输出
It is in final chunk.
1
异常处理的流程
- 如果程序中产生了异常,那么JVM会根据异常类型实例化一个指定异常类的对象。
- 如果程序中没有异常处理操作,那么此对象将会交给JVM处理,JVM打印异常信息,然后中断程序。
- 如果存在异常处理,由try捕获此异常类对象。
- 然后与try后的catch进行匹配,匹配成功,由catch处理,如匹配不成功,交由JVM处理。
- finally子句的内容将被执行。
throw和throws
使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。
throw关键字是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象。
package methoud;
class Math{
public int div(int i,int j) throws Exception{ // 定义除法操作,如果有异常,则交给被调用处处理
System.out.println("***** 计算开始 *****") ;
int temp = 0 ; // 定义局部变量
try{
temp = i / j ; // 计算,但是此处有可能出现异常
}catch(Exception e){
throw e ; //抛出异常。
}finally{ // 不管是否有异常,都要执行统一出口
System.out.println("***** 计算结束 *****") ;
}
return temp ;
}
};
public class ThisDemo06{
public static void main(String args[]){
Math m = new Math() ;
try{
System.out.println("除法操作:" + m.div(10,0)) ;
}catch(Exception e){
System.out.println("异常产生:" + e) ;
}
}
};
Java异常处理原则之一:延迟捕获
意思是,当异常发生时,不应立即捕获,而是应该考虑当前作用域是否有有能力处理这一异常的能力,如果没有,则应将该异常继续向上抛出,交由更上层的作用域来处理。参考此处