说明:为了较为详细地说明流程,代码中的注释比较多,很是影响了代码的可读性。。望大家。。海涵一下。
建议阅读方法:先按照数字标号为顺序,依次阅读红色注释,随后的顺序随意。
example 1:
class ExceptionExe
{
static void func() throws Exception
{
try //4、来到func()以后第一句就是try,看来try里面的语句又可能发生异常,我们继续看
{
throw new Exception();//5、果然,这里抛出了一个类型为Exception的异常,这里称a
//System.out.println("func里的try执行"); //throw后都是无法执行的语句
}
catch (Exception e)//6、a这个异常被catch给捕捉到了(在方法体内自行解决异常)
{ //7、现在a这个异常要被catch中的代码块审判了。
System.out.println("func里的catch执行1");//8、审判第一步:输出一个语句。
//9、没想到审判进行到一半,发现a不能这么被解决,就又被抛给func()的调用者了。
throw e;
//System.out.println("func里的catch执行2");//throw后都是无法被执行的语句
}
finally
{ //10、func()调用者接收这个a这个异常前,先得把a的遗言(finally)执行一下。
System.out.println("func里的finally执行");
}
}
//1、大家好,我们先从入口main进入这个程序。
public static void main(String[] args)
{
try //2、这里有一个try,说明其中的语句可能会产生异常哦。
{
func();//3、try调用了func()方法,我们去往func()看一看
//unluckily,下面这句话没有被执行,因为在try中的代码段一旦真的出现异常后,就会立即被对应的catch捕捉然后处理。
System.out.println("func()后的一句话执行");
}
catch (Exception e)
//11、遗言执行完了,来看看main是怎么对a处理的吧。
{
System.out.println("main()里的catch执行");//12、好吧,又是一个输出。
}
finally
{
System.out.println("main()里的finally执行"); //13、处理完了以后再执行一个遗言
}
System.out.println("Hello World!");//14、这是故事的后记。 }
输出:
func里的catch执行1
func里的finally执行
main()里的catch执行
main()里的finally执行
Hello World!
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面请看example2 (请注意与1中的不同之处。)
example 2:
class ExceptionExe
{
static void func() //throws Exception //被注释掉了亦然能够通过编译。
//okay,这里值得注意的是在方法头处可以不用throws异常,因为异常已经在方 //法内部被解决了,
//即:这个方法并没有给调用者抛出异常(抛给自己,自己解决)。
{
try //4、来到func()以后第一句就是try,看来try里面的语句又可能发生异常,我们继续看
{
throw new Exception(); //5、果然,这里抛出了一个类型为Exception的异常,这里称a
}
catch (Exception e) //6、a这个异常被catch给捕捉到了(在方法体内自行解决异常)
{ //7、现在a这个异常要被catch中的代码块审判了。
System.out.println("func里的catch执行1"); //8、审判:输出一个语句。
//throw e; //被注释掉了。
//9、和上面的例子不一样,对异常的处理到这里就顺利结束了,而没有传给调用者。
//也就是说:异常a已经很干净地被处理掉了,目前没有异常,调用者不会发现异常曾经存在过!
}
finally
{ //10、对了,还得把a的遗言(finally)执行一下。
System.out.println("func里的finally执行");
}
}
//1、大家好,我们先从入口main进入这个程序。
public static void main(String[] args)
{
try //2、这里有一个try,说明其中的语句可能会产生异常哦。
{
func(); //3、try调用了func()方法,我们去往func()看一看
//注意,这句话输出了。因为调用方法fun()结果并没有出现异常(已经在func()内部解决了)
//没有出现异常,所以按正常代码块一样顺序执行。所以执行了下面的输出语句。
System.out.println("func()后的一句话执行");
}
catch (Exception e)
{
//注意,这句话没有执行。因为try里面的代码段并没有抛给调用者main异常,(已经在func()内部自行解决了)
System.out.println("main()里的catch执行");
}
finally
{
System.out.println("main()里的finally执行"); //11、还是按礼数执行一下finally
}
System.out.println("Hello World!"); //12、这是故事的后记。
}
}
输出:
func里的catch执行1
func里的finally执行
func()后的一句话执行
main()里的finally执行
Hello World!