欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java Exception

程序员文章站 2022-07-15 12:54:06
...

搞清原理很重要,基础的东西一定要扎实,给自己的一句话。

throws 定义一个方法时候可以用throws关键字声明,表示此方法不处理异常,而交给方法调用处处理

public class MathDemo {

    public int div(int i,int j) throws Exception{//定义除法异常,如果有异常,则交给被调用处处理
        int temp=i/j;   //计算,但是此处可能出现异常
        return temp;
    }
}
//-=-=-=-=-=-=-=-=-=-=-
public class ThrowDemo{
        public static void main(String args[]){
            MathDemo m = new MathDemo();
            try {
                Log.e("mrpeng", "除法操作: "+m.div(10,2));
            } catch (Exception e) {
                e.printStackTrace();//打印异常
            }
        }
    }

div 使用了throws关键字声明,所以调用此方法的时候,方法外面必须进行异常处理,即 try…catch
如果在主方法也是用throws关键字,意味着主方法可以处理异常

public class ThrowDeno {
    public static void main(String args[]) throws Exception {
        MathDemo m = new MathDemo();
        Log.e("mrpeng", "除法操作: " + m.div(10, 2));
    }
}

主方法不处理任何异常,而交给java最大头JVM,所以如果在主方法使用了throws关键字,则表示一切异常交给JVM处理,默认处理方式也是JVM完成。

throw关键字
作用,抛出一个异常,抛出的是一个异常类的实例化对象,
在异常处理中try语句要捕获的是一个异常对象,此异常对象也可以自己抛出

public class ThisDemo06{
    public static void main(String args[]){
        try{
            throw new Exception("自己抛着玩的。") ;    // 抛出异常的实例化对象
        }catch(Exception e){
            System.out.println(e) ;
        }
    }
}

一般开发中 try catch finally ,throw,throws联合使用情况最多

class Math{
    public int div(int i,int j) throws Exception{    // 定义除法操作,如果有异常,则交给被调用处处理
        System.out.println("***** 计算开始 *****") ;
        int temp = i / j ;    // 计算,但是此处有可能出现异常
        System.out.println("***** 计算结束 *****") ;
        return temp ;
    }
};
public class ThrowDemo02{
    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.lang.ArithmeticException: / by zero

以上计算结束,因为没有异常发生了,直接中断程序操作,所以做以下操作。

class Math{
    public int div(int i,int j) throws Exception{    // 定义除法操作,如果有异常,则交给被调用处处理
        System.out.println("***** 计算开始 *****") ;
        int temp = 0 ;    // 定义局部变量
        try{
            temp = i / j ;    // 计算,但是此处有可能出现异常
        }catch(Exception e){
        }
         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.lang.ArithmeticException: / by zero

这里异常在方法中自动被处理,并没有抛出去,要抛出异常对象,给方法调用处处理,需要使用throw关键字

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 ;    //抛出异常。使用中也可用if判断  不用try catch
        }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) ;
        }
    }
};

总结

throw与throws关键字联合使用问题。

1)throw:抛出异常。

2)throws:在方法声明处使用,表示此方法不处理异常,而在调用此方法处处理异常。

Exception是必须处理的,而RuntimeException异常是可以不处理的。但是为了保证程序正常运行,最好处理。

如果自定义异常,直接继承异常即可。

关于try catch finally 中的return问题
* 情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。
* 情况2:try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。
* 情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
- 情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
- 情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
- 情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。

结论:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

相关标签: java