Java Exception 异常机制 (1)--throws 和 throw 区别

 

 

throws e

运用在方法标签后面:
如下

 public class Math {
    public int  method01(int i,int j)throws Exception{
     int c =i/j;
     return c;      
    }
}
  • 表示将此method01方法中可能存在的Exception 抛出异常给调用此方法的方法,当前方法不做异常的处理

  • 此时要注意,当有上级方法调用method01方法时,就一定需要对mehod01中抛出的异常进行处方法处理,否则上级类中调用method01时会报错;

  • 可以在上级方法中再次在方法标签后 throws e,抛出给上上级(处理代码一),或者在调用method01方法处进行try-catch(处理代码二)

  • 当方法层层调用时,需要一层层抛出,如果在main方法中抛出throws e 的话,想当于异常交由jvm处理,也相当于没有抛出异常,因为程序会在bug处停止,面我们利用异常机制对异常进行抛出,希望能够在控制台查看到错误信息,确不影响程序运行。

处理代码一:

public class Math {
    public int  method01(int i,int j)throws Exception{
    System.out.println("mehod方法开始");
        int c =i/j;
        System.out.println("mehod方法结束");
     return c;      
    }
}

 

  public class TrowsDamo2 {
  public static void main(String[] args)  {
        Math math = new Math();
        System.out.println("运算开始");
        try {
        int div2 = math.method01(15, 0);//此时调用Math类的method01方法
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        System.out.println("运算结束");

    }

执行结果

运算开始
mehod方法开始
/ by zero
运算结束

分析:在main方法中调用了Math类中的methdod01方法,并且method01抛出异常,在main方法中进行try-catch,对异常进行处理。(ps:如果此时main方法也对异常进行上抛 thows e 的话,程序会将异常交由jvm处理,程序会报错)
method01方法中,“method方法结束”没有输出,在下层方法中,遇到异常,异常后面的代码不再执行 代码二可以解决此问题。

处理代码二: 

public class Math { 

public int method01(int i,int j)throws Exception{//

抛出异常 System.out.println("mehod方法开始");  

 int c=0; 

try { c =i/j; } 

catch (Exception e) {

System.out.println(e.getMessage()+"---method01异常"); } 

System.out.println("mehod方法结束"); return c; } }

 

 

 

public class TrowsDamo2 {
  public static void main(String[] args)  {
        Math math = new Math();
        System.out.println("运算开始");
try {

    int div2 = math.method01(15, 0);//此时调用Math类的method01方法

        } catch (Exception e) {
            System.err.println(e.getMessage()); // 此处没有捕获到异常
        }
        System.out.println("运算结束");
        }
}

输出结果

运算开始
mehod方法开始
/ by zero---method01异常
mehod方法结束
运算结束

分析

method01方法对外抛出异常,但方法内部使用try-catch进行捕捉异常,异常在catch块已处理,不会再对外抛出异常,所以main方法中的try-catch中未捕捉到异常未打印出异常信息
虽然代码二中,实现了在异常后代码的执行,却没有办法实现异常的上抛。


throw e

一般配合try-catch 使用 
格式如下

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

throw e 实现了在try-catch块中对异常的上抛,catch块中不再对异常进行处理 在catch块中,throw e后不能再跟代码 ,且cathc块外,后面的代码不被执行
以下错误例子

 catch (Exception e) {
        throw e; //下面这句打印会编译报错,throw后不能加指令
     System.out.println(e.getMessage());

    }finally {
        System.out.println("finally块中必然执行");
        //finally块会执行
    }
    System.out.println("此命令不会执行");
    //throw后,命令不执行

特别说明:

  • 当层层调用时,如果是都是使用在方法签名后使用throws抛出异常,下层代码中,任何一层出现bug,会在bug处抛出异常,bug代码后的指令将不会执行。
  • 使用try-catch块中,throw抛出异常,throw后的代码也将不会再执行

以下为例子

    public class Math {
    public int  method01(int i,int j){//抛出异常
    System.out.println("mehod方法开始");
        int c=0;
    try {
             c =i/j;
        } catch (Exception e) {

         System.out.println(e.getMessage());
         throw e; //下面这句打印会编译报错,throw后不能加指令

        }finally {
            System.out.println("finally块中必然执行");
            //finally块会执行
        }
        System.out.println("此命令不会执行");
        //throw后,命令不执行
        return c;

    }

}

 

public class TrowsDamo5 {
  public static void main(String[] args)  {

            try {
                new TrowsDamo5().grandSonMethod();

            } catch (Exception e) {
                System.err.println("rer");
            }
        System.err.println("stop");

    }
  public void grandSonMethod() throws Exception{
    Math math = new Math();
        System.out.println("运算开始");

     try {
         int div2 = math.method01(15, 0);//此时调用Math类的method01方法
        } catch (Exception e) {
            System.err.println("imfool");
            throw e;
        }

        System.out.println("运算结束");

  }

}  

 

运算开始
mehod方法开始
/ by zero
finally块中必然执行
imfool
stop

这个代码稍微复杂点,我使用流程图来描述

ps:Exception与runtimeException区别

观察以下代码:

package methoud;
public class ThisDemo06{
public static void main(String args[]){
String str = "123" ;// 定义字符串,全部由数字组成
int temp = Integer.parseInt(str) ; // 将字符串变为int类型
System.out.println(temp * temp) ;// 计算乘方
}
};  

 

  public static int parseInt(String s) throws NumberFormatException

此方法明明使用了throws关键字抛出异常,为什么不用处理,也可以编译通过?

在JAVA异常处理机制中,

1)如果抛出的是EXception的类型,则必须进行try ..catch进行处理。

2)如果抛出的是RuntimeException的类型,则可以不使用try。。catch处理,一旦发生异常之后,将由JVM处理。

为了保证程序的健康性,在有可能出现异常的时候还是老实使用try ..catch处理。 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值