1. code 如下:
throws:
public Object aroundMethod(ProceedingJoinPoint pjd) throws Throwable{
Object result = null;
String methodName = pjd.getSignature().getName();
Object[] args = pjd.getArgs();
result = pjd.proceed(); //这句出现异常,但是被throws 了(throw 给了调用者,<span style="color:#ff0000;">调用者try catch 住这个异常</span>),所以后面的aaa 句子不执行
System.out.println("The method "+ methodName +" ends ");//aaa
return result;
}
throw:
public Object aroundMethod(ProceedingJoinPoint pjd){
Object result = null;
String methodName = pjd.getSignature().getName();
Object[] args = pjd.getArgs();
//执行目标方法
try {
System.out.println("The method "+ methodName +" begins with "+ Arrays.asList(args));
result = pjd.proceed();//这句出异常,则aaa 不执行,直接跳到catch 里
System.out.println("The method "+ methodName +" ends with "+result);//aaa
} catch (Throwable e) {
throw new RuntimeException(e);//如果这句不throw,调用者根本不知道这里发生了异常,还没事一样
//这句throw 执行后,(直接throw 给调用着这个异常,<span style="color:#ff0000;">调用者需要try catch 住这个异常</span>),bbb 不执行
}
System.out.println("The method "+ methodName +" ends ");//bbb
return result;
}
注意:上面两处提到,(throw / throws 抛给上层异常),调用者try catch 住这个异常,
(1)catch 住,则调用者调用了aroundMethod( ) 这个方法之后,后面的语句还能执行
(2)不catch 住,则调用者拿到这个异常throw 给了JVM,JVM 打印出错误的堆栈信息.
try catch 对于jvm 的关系三点:
(1)try catch 只要没人接throw 过来的exception,那么jvm 就接,就打印出红色的堆栈信息。如果有人接,则这个exception,jvm 就不知道了(可以这么理解),这样执行完catch 中的句子,还能执行catch 后面的句子。
(2)try catch,try 里面的句子发生异常,可能是这个句子本身的异常,也可能是这个句子调用了函数,那个函数发生的异常,不管什么,只要这个try 接住了这个throw 过来的异常,那么就可以不给jvm ,就可以不影响程序流的执行。
(3)try 就是自己吃掉这个异常,不给上层调用者了,throws 就是自己不吃掉,让上层去吃掉,等同与下面的 aaa
try 和 throw / throws 关系一点:
(1)throw / throws 就是往上层扔异常,就是throw 抛给调用者(调用者不try 吃掉,这个异常就给JVM ,也就是打印红色堆栈信息),
try catch 就是吃掉try 里面句子发生的异常 aaa
try catch / throw / throws 对后面代码的影响:
(1)throw / 函数名上throws 均执行不到异常代码后面的语句
(2)try catch ,这个语句块后面的语句照常执行.