//题目要求:要求必须输出“计算开始”,“计算有错",如果出现异常则交给调用处执行,必须有NumberFormatException异常,ArithmeticException异常
代码:
package 第七章.课后作业.one;
class Math{
public int math(String a,String b) throws NumberFormatException,ArithmeticException{
System.out.println("-----计算开始-----");
int temp=0,x,y;
x=Integer.parseInt(a); //拆箱
y=Integer.parseInt(b); //如果这里出现了异常,因为方法调用的原因他直接会
try {
temp=x/y; //此代码不再执行
} catch (Exception e) { //此代码不再执行
System.out.println("抛出一个异常"); //此代码不再执行
}
finally { //此代码不再执行
System.out.println("-----计算有错----"); //此代码不再执行
}
System.out.println("还在执行"); //此代码不再执行
return temp; //此代码不再执行
}
}
public class ThrowDemo {
public static void main(String[] args) {
Math m=new Math();
try {
System.out.println("计算结果="+m.math("a", "0"));
} catch (NumberFormatException e) {
System.out.println("数字转换有异常----"+e);
}catch (ArithmeticException e) {
System.out.println("算法有异常1----"+e);
}
System.out.println("结束了");
}
}
1.在我开始的时候,我给math赋的值是math(a,0)想到他应该会抛出两个错误,可是后来他只抛出了一个NumberFormatException(数字转换异常),然后我就明白了,在调用math()方法时,根据顺序,如果拆箱出了错误,他就会被catch捕获,执行调用方法下面的代码,而不会继续执行math()中的语句。
这是math(1,0)的结果,按照执行顺序,应该还是会在调用处抛出0的异常,但是ArithmeticException(算法异常)已经被抛出了,所以不再执行。如果把math()中的删除,可以发现,他就会在调用处,又抛出异常了。
删除math()中的catch后的结果
2.当catch捕获了一个异常之后,后面的catch,他将不会再执行。这也是为什么Exception会放在最后的原因。捕获范围打的要放在捕获范围小的后面。