1.throws 用于抛出方法层次的异常, 并且直接由些方法调用异常处理类来处理该异常, 所以它常用在方法的后面。比如 public static void main(String[] args) throws SQLException
2.throw 用于方法块里面的代码,比throws的层次要低,比如try...catch....语句块,表示它抛出异常, 但它不会处理它, 而是由方法块的throws Exception来调用异常处理类来处理。
3. 一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。
try { //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 } catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 } finally { //不管什么情况都会执行,包括trycatch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally }
<1>.try+catch 程序的流程是:运行到try块中,如果有异常抛出,则转到catch块去处理。然后执行catch块后面的语句
<2>.try+catch+finally 程序的流程是:运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码。 如果没有异常抛出,执行完try块,也要去执行finally块的代码。然后执行finally块后面的语句
<3>.try+finally 程序的流程是:运行到try块中,如果有异常抛出的话,程序转向执行finally块的代码。那末finally块后面的代码还会被执行吗?不会!因为你没有处理异常,所以遇到异常后,执行完finally后,方法就已抛出异常的方式退出了。 这种方式中要注意的是,由于你没有捕获异常,所以要在方法后面声明抛出异常
共同点: 在catch块和finally块中仍然可以再抛出新的异常 例如 throw new Exception("illegal invoked");
如果对于新抛出的异常没有写try的话,则要在方法后面声明抛出异常 反之,如果给catch块或finally块里的异常再套上一层try,catch的话,方法后面就不必声明异常了。
注意点:
每次执行后输出结果的顺序可能都不太相同,这是因为采用不同的流打印的结果,不必太在意
|