1700449185
1700449186
try{
1700449187
1700449188
super();
1700449189
1700449190
}catch(IOException e){
1700449191
1700449192
//异常处理后再抛出
1700449193
1700449194
throw e;
1700449195
1700449196
}finally{
1700449197
1700449198
//收尾处理
1700449199
1700449200
}
1700449201
1700449202
}
1700449203
1700449204
}
1700449205
1700449206
很不幸,这段代码编译通不过,原因是构造函数Sub中没有把super()放在第一句话中,想把父类的异常重新包装后再抛出是不可行的(当然,这里有很多种“曲线”的实现手段,比如重新定义一个方法,然后父子类的构造函数都调用该方法,那么子类构造函数就可以自由处理异常了),这是Java语法限制。
1700449207
1700449208
将以上三种异常类型汇总起来,对于构造函数,错误只能抛出,这是程序人员无能为力的事情;非受检异常不要抛出,抛出了“对己对人”都是有害的;受检异常尽量不抛出,能用曲线的方式实现就用曲线方式实现,总之一句话:在构造函数中尽可能不出现异常。
1700449209
1700449210
注意 在构造函数中不要抛出异常,尽量曲线救国。
1700449211
1700449212
1700449213
1700449214
1700449216
编写高质量代码:改善Java程序的151个建议 建议115:使用Throwable获得栈信息
1700449217
1700449218
AOP编程可以很轻松地控制一个方法调用哪些类,也能够控制哪些方法允许被调用,一般来说切面编程(比如AspectJ)只能控制到方法级别,不能实现代码级别的植入(Weave),比如一个方法被类A的m1方法调用时返回1,在类B的m2方法调用时返回0(同参数情况下),这就要求被调用者具有识别调用者的能力。在这种情况下,可以使用Throwable获得栈信息,然后鉴别调用者并分别输出,代码如下:
1700449219
1700449220
class Foo{
1700449221
1700449222
public static boolean m(){
1700449223
1700449224
//取得当前栈信息
1700449225
1700449226
StackTraceElement[]sts=new Throwable().getStackTrace();
1700449227
1700449228
//检查是否是m1方法调用
1700449229
1700449230
for(StackTraceElement st:sts){
1700449231
1700449232
if(st.getMethodName().equals(“m1”)){
1700449233
1700449234
return true;
[
上一页 ]
[ :1.700449185e+09 ]
[
下一页 ]