Java中errors,Exception 以及 try-catch与throws、throw 相关

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        
  • 异常处理的流程

    1. 如果程序中产生了异常,那么JVM会根据异常类型实例化一个指定异常类的对象。
    2. 如果程序中没有异常处理操作,那么此对象将会交给JVM处理,JVM打印异常信息,然后中断程序。
    3. 如果存在异常处理,由try捕获此异常类对象。
    4. 然后与try后的catch进行匹配,匹配成功,由catch处理,如匹配不成功,交由JVM处理。
    5. 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异常处理原则之一:延迟捕获

    意思是,当异常发生时,不应立即捕获,而是应该考虑当前作用域是否有有能力处理这一异常的能力,如果没有,则应将该异常继续向上抛出,交由更上层的作用域来处理。参考此处

猜你喜欢

转载自blog.csdn.net/u012156116/article/details/80841795
今日推荐