2.3.1 try语句可能会抛弃一个或多个例外。
2.3.2 catch语句,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明
了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕捉,大括号
中包含对象的处理,其中可以调用对象的方法。
catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理
的例外类型进行检测,直到找到类型相匹配的catch语句为止。
也可以用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类。
2.3.3 finally语句
finally所指定的代码都要被执行,通常在finally语句中可以进行资源的清除工作。如关闭打开的文
件等。
2.3.4 throws语句
throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。假如你想明确地抛出一
个RuntimeException,你必须用throws语句来声明它的类型。
2.3.5 throw语句
throw总是出现在函数体中,用来抛出一个异常。
3 要害字及其中语句流程详解
3.1try的嵌套
每当碰到一个try语句,异常的框架就放到堆栈上面,直到所有的try语句都完成。假如下一级的try
语句没有对某种异常进行处理,堆栈就会展开,直到碰到有处理这种异常的try语句。下面是一个try语句
嵌套的例子。
class MultiNest {
static void procedure() {
try {
int a = 0;
int b = 42/a;
} catch(java.lang.ArithmeticException e) {
System.out.println("in procedure, catch ArithmeticException: " + e);
}
}
public static void main(String args[]) {
try {
procedure();
} catch(java.lang. Exception e) {
System.out.println("in main, catch Exception: " + e);
}
}
}
这个例子执行的结果为:
in procedure, catch ArithmeticException: java.lang.ArithmeticException: / by zero
成员函数procedure里有自己的try/catch控制,所以main不用去处理 ArrayIndexOutOfBoundsException;当然如果在procedure中catch到异常时使用throw e;语句将异常抛出,那么main当然还是能够捕捉并处理这个procedure抛出来的异常。例如在procedure函数的catch中的System.out语句后面增加throw e;语句之后,执行结果就变为:
in procedure, catch ArithmeticException: java.lang.ArithmeticException: / by zero
in main, catch Exception: java.lang.ArithmeticException: / by zero
我认为try catch和正常的if else一样都是程序流程块,同样他们内部定义的变量对外部都是不可见的。如果try中的程序执行过程中有异常e抛出,如果e是catch中的定义的异常或是其子类,那么程序就会跳转到catch那边执行catch中的程序,如果catch中的程序又有异常抛出,那么就看这个异常有没有新的try catch块来捕获它,如果没有的话,那它就抛出了,程序中止执行。关于finally的理解就是任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。
3.5 如何抛出异常
如果你知道你写的某个函数有可能抛出异常,而你又不想在这个函数中对异常进行处理,只是想把它抛出去让调用这个函数的上级调用函数进行处理,那么有两种方式可供选择:
第一种方式:直接在函数头中throws SomeException,函数体中不需要try/catch。
第二种方式:使用try/catch,在catch中进行一定的处理之后(如果有必要的话)抛出某种异常。
第三种方法:使用try/catch/finally。