编程执行过程中很可能出现错误,比如文件不存在,除以0等问题都有可能影响程序的正常运行导致非常规终止,通常将可能出现异常的语句放入try{}语句中,将出现错误后需要执行的语句放入到catch{}语句中,将无论是否发生异常都要执行的语句放在finally{}语句中。
当程序执行出现异常的时候,系统会抛出一个异常,从try{}中跳出到catch{}中进行捕捉。不过不管有没有异常产生,finally{}中的语句都将执行。在catch中根据Exception的衍生累可以捕捉多种异常 举例子 触发中我们可以捕捉高等级的也可以捕捉低等级的 (自己编的)可以是 NumbercalException 也可以是低级的DevideByZeroException。
捕捉的异常一定要是可能产生的异常,你在一个触法中捕获IO异常,这是不可能触发的,高级的编辑器会提醒你你的异常是捕捉不到的。
异常可以由下向上提交,例如外层有一个异常捕获,内层还有一个异常捕获不过捕获到的异常它无法处理,那么会提交到外层的继续处理,所有的都处理不了那么就异常结束程序。
小例子
public class Test {
public static void main(String[] args)
{
int c,a=1,b=0;
try{
c = a/b;
}
//,java中整数除以0会引发 java.lang.ArithmeticException:
catch(ArithmeticException e)
{
e.printStackTrace();
c = a/1;
}
finally
{
}
System.out.println(c);
}
}
注意:
- catch可以有多个 用于捕捉多种异常,就像else if一样多个累在一起。
- finally用于必须执行的代码,本例子是不需要的 因为计算正确不用管 计算错误变为除以1,没有通用的代码部分。可以用的像打开文件写数据,无论写的时候是否发生错误,都需要关闭IO操作。
- 在编辑器中,当一个代码块可能发生异常时但你没有进行异常处理,那么会提醒你,所以你必须把它放在try{}catch{}finally{}结构中.
多层异常处理
public class CatchWho {
public static void main(String[] args) {
try {
try {
//自行抛出异常 自己编程的时候也可以手动抛出 这里是为了示意
throw new ArrayIndexOutOfBoundsException();
}
catch(ArrayIndexOutOfBoundsException e) { //捕捉这个异常
System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
}
//抛出另一个异常
throw new ArithmeticException();
}
//外层捕捉异常
catch(ArithmeticException e) {
System.out.println("发生ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
}
}
}
程序运行结果:
ArrayIndexOutOfBoundsException/内层try-catch
发生ArithmeticException
发现没有,内部的异常被内部捕捉乐,就不会再次传到外部,因为已经被处理了,但是没有处理的异常还是会被处理。
当有多个try{}catch{}finally{}语句嵌套使用,根据异常在不同层次不同位置的抛出,是会造成finally语句不同的执行结果,情况非常的多,多动手测试一下就会发现其中的有个规律。但是总体原则是:一个异常抛出的语句到捕获这个异常的catch语句之间的语句,不论是try,catch,finally语句都不会执行。一个异常被捕获后被处理则不会继续触发。